User Tag List

Показано с 1 по 10 из 12

Тема: Estex DSS и shell

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    Error404, давай код, чтоли, не работающий. файлик приатач.
    из мануала:

    нормально выводится, ничего не затирается. во всяком случае я с таким не сталкивался.
    отладчик есть: если на реале - demon.exe. Можно и под эмулем. бреак ставится в дебагере даблкликом слева от адреса.
    В этом самом примере вместо
    MSG: db "Hello, world!",0Dh,0Ah ;наша стока

    Напиши
    MSG: db "Hello, world!" ;наша стока

    И эту строку не увидишь если запускать helloworld из промпта (приглашения) ОС, т.е. в CCP/shell
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    16.01.2005
    Адрес
    California, USA
    Сообщений
    828
    Спасибо Благодарностей отдано 
    108
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    73 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    В этом самом примере вместо
    MSG: db "Hello, world!",0Dh,0Ah ;наша стока

    Напиши
    MSG: db "Hello, world!" ;наша стока

    И эту строку не увидишь если запускать helloworld из промпта (приглашения) ОС, т.е. в CCP/shell
    ну вот тут извините-подвинтесь - это таки фича, а не баг
    если хочешь чтобы твоя строка вывелась, то по правилам всех терминалов и шеллов её надо закончить переводом
    Администратор сетевого сообщества nedoPC.org
    Урал 8/64К, Sp2000, ZX48K+, ZX16K (спалил), TS1000 (американский ZX81), TS2068, Дельта-С, 20 лет собираю ATM Turbo 2+
    Неспектрумы: Электроника МК-85 и МК-85М, ПК-01 Львов, БК-0011, Вектор-06Ц, Лик (спец), Апогеи, Radio-86RK SRAM 32K & 128K (всё ещё собираю)

  4. #3

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от 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
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Estex API
    от Smalovsky в разделе Sprinter
    Ответов: 11
    Последнее: 26.07.2021, 00:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •