Администратор сетевого сообщества nedoPC.org
Урал 8/64К, Sp2000, ZX48K+, ZX16K (спалил), TS1000 (американский ZX81), TS2068, Дельта-С, 20 лет собираю ATM Turbo 2+
Неспектрумы: Электроника МК-85 и МК-85М, ПК-01 Львов, БК-0011, Вектор-06Ц, Лик (спец), Апогеи, Radio-86RK SRAM 32K & 128K (всё ещё собираю)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Не, не так.
При вводе с клавиатуры - да, в некоторых случаях обработка буфера начинается после нажатия на Enter.
А заканчивать строку переводом строки при выводе ваще не обязательно. Как и файл не обязан заканчиваться переводом строки или символом ^Z (EOF) - в этом случае type/cat выводит его до физического конца.
А вот при выводе промпта ведут себя шелы действительно по-разному:
- либо делают CR-LF перед промптом как например cmd.exe в Win/MSDOS:
- либо не делают ни CR ни LF перед промптом, как например bash:Код:C:\WINDOWS\system32>echo HELLO HELLO C:\WINDOWS\system32>
В обоих случаях, они текст не затирают. А если делать один CR (или как достигается такой эффект) - то текст будет затираться.Код:[centos8@cc1 ~]$ echo hello hello [centos8@cc1 ~]$ echo -n hello hello[centos8@cc1 ~]$
Как бы там ни было, я таки вставил в том "спорном" месте перевод строки 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 - это кэш. Т.е. тут по русскому народному принципу "кто раньше встал того и тапки" - "быструю память" получит тот процесс, который резервирует первым. Мораль: ресурсоёмкое надо планировать, и запускать первым. Т.к. требовать у системы конкретные страницы - нельзя, можно только просить (как тут уже кто-то схохмил).
- - - Добавлено - - -
Еще из интересных "фич".
Я никак не использую управление атрибутами символов, прога работает так как ее выпульнул шелл.
Запускаю прогу 4 раза из тимплета ("стрелка вверх, ентер", "стрелка вверх, ентер", "стрелка вверх, ентер", "стрелка вверх, ентер"). Два раза прога выводит текст белым по черному. И остальные разы эта же самая прога - зеленым по черному, "окрашиваясь в те цвета, в которые оно себя окрасило"(с)
Т.е. установку режимов похоже таки надо рекомендовать.
И возможно не только установку режимов, а похоже еще и контроль скролируемого, ибо тут явно что-то не то вырисовывается.
- - - Добавлено - - -
Медленно - это насколько медленно, и почему так считаешь? Если порядка пары сотен тактов, то это не страшно, КМК. Плата за системность (возможность правки логики в едином месте не меняя всех миллиардов спринтеровских программ). Врядли мне это понадобится делать интенсивно, так что если это не прямо ужас-ужас, то я голосую за функции BIOS/BDOS.
А что здесь такое "Level" ?
А "File handle for preloader" означает ли что большой (очень) EXE-файл шеллом будет загружен не до конца (а насколько не до конца?) и некий встроенный в файл загрузчик его должен сам дозагрузить?
- - - Добавлено - - -
Вот еще такой момент.
Мне понравился хак ИванМака, когда чтобы вызвать BIOS, "накрытый" в окне 0000.3FFF другой страницей пользователя, в области 8h..0Eh кладется код "переключалки" и делая RST 8 в эту п\п, можно попадать в BIOS и обратно. Почему так же не сделано для BDOS (rst 10h)? Это архиудобно, КМК.
- - - Добавлено - - -
Вот оно:
Вызов BIOS из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна
располагаться такая программа:
; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установитьКод:PUSH AF LD A,0 OUT (07Ch),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и ; программа уйдет в него. POP AF ; На эту команду происходит возврат при таком ; вызове биоса. RET
; две команды XOR A и DI
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)