Такой вариант.
Вид для печати
Такой вариант.
вобщем после небольшого исследования, выяснилось, что в прошивке ROM 48 зачем-то наглухо прибиты гвоздями адреса процедур вывода для каналов S и K.
Вот два места, где они перетираются:
Код:; This entry point is called from CL-ALL below to
; reset the system channel input and output addresses to normal.
;; CL-CHAN
L0D94: LD A,$FD ; select system channel 'K'
CALL L1601 ; routine CHAN-OPEN opens it.
LD HL,($5C51) ; fetch CURCHL to HL to address current channel
LD DE,L09F4 ; set address to PRINT-OUT for first pass.
AND A ; clear carry for first pass.
;; CL-CHAN-A
L0DA0: LD (HL),E ; insert output address first pass.
INC HL ; or input address on second pass.
LD (HL),D ;
Я попробовал сделать патч для ROM, для этого в образе ПЗУ нужно прописать нули по адресам: $0da0, $0da2, $0dcf, $0dd1.Код:; ---------------------------
; Clearing whole display area
; ---------------------------
; This subroutine called from CLS, AUTO-LIST and MAIN-3
; clears 24 lines of the display and resets the relevant system variables
; and system channels.
;; CL-ALL
L0DAF: LD HL,$0000 ; initialize plot coordinates.
LD ($5C7D),HL ; set COORDS to 0,0.
RES 0,(IY+$30) ; update FLAGS2 - signal main screen is clear.
CALL L0D94 ; routine CL-CHAN makes channel 'K' 'normal'.
LD A,$FE ; select system channel 'S'
CALL L1601 ; routine CHAN-OPEN opens it
CALL L0D4D ; routine TEMPS picks up permanent values.
LD B,$18 ; There are 24 lines.
CALL L0E44 ; routine CL-LINE clears 24 text lines
; (and sets BC to $1821)
LD HL,($5C51) ; fetch CURCHL make HL address current
; channel 'S'
LD DE,L09F4 ; address: PRINT-OUT
LD (HL),E ; is made
INC HL ; the normal
LD (HL),D ; output address.
Можно использовать такой bash скрипт для патча ПЗУ:
После этого можно спокойно ставить свой адрес вывода для канала S и он не перетирается:Код:#!/usr/bin/env bash
cp 48-origin.rom 48.rom
printf '\x00' | dd of=48.rom bs=1 seek=$((0x0da0)) conv=notrunc
printf '\x00' | dd of=48.rom bs=1 seek=$((0x0da2)) conv=notrunc
printf '\x00' | dd of=48.rom bs=1 seek=$((0x0dcf)) conv=notrunc
printf '\x00' | dd of=48.rom bs=1 seek=$((0x0dd1)) conv=notrunc
https://i.imgur.com/BMN6Wuw.png
Непонятно - зачем было делать перетирание захардкожеными адресами процедур в оригинальной ПЗУ. Потестил с пропатченой версией ПЗУ - вроде все работает как в оригинале.
- - - Добавлено - - -
это вероятно автор того BASIC-64, что выше приводили. Там точно те-же процедуры и IM 2 прерывание, которое постоянно переписывает процедуры каналов.Но это не работает стабильно, после перетирания и до прихода прерывания может напечаться какой-то текст через стандартную процедуру вывода, к тому-же прерывание может прийти когда первая половина адреса переписана из ПЗУ, а вторая нет, тогда после выхода из прерывания перепишется вторая часть адреса и адрес будет некорректный, что приведет к сбою или сбросу системы.
В BASIC-64 там еще и графика стандартного шрифта уполовинена, поэтому кода такое проиходит то символы рисуются на стандартных 8x8 знакоместах, но в обрезаном виде.
Оптимальнее всего как мне кажется просто пропатчить 4 байта в ПЗУ и спокойно юзать свои процедуры вывода.
- - - Добавлено - - -
В TR-DOS чтото ломается в выводе заставки в режиме 64x24:
https://i.imgur.com/1pxvI1z.png
Для полноценного терминала с большим текстовым разрешением есть проблема с тем как координаты хранятся: X хранится как 0x21-X, а Y хранится как 0x18-Y, в результате есть жесткая привязка к 32x24. Если для X это не критично, то с Y проблемка со скролами возникает.
Да, действительно, адреса в стандартных описателях каналов восстанавливаются после очистки экрана. Почему? Это неизвестно, но у авторов системы ZX Spectrum могли быть веские причины.Цитата:
Сообщение от ZXMAK
Тогда это не будет работать у всех остальных пользователей. С точки зрения ОС ZX Spectrum правильно создать свой канал, подключить его к потоку и выводить в него. Еще можно модифицировать описатель канала "P" (если не предполагается работа с принтером) - он не будет изменяться процедурами ПЗУ, и использовать команды для вывлда PRINT #3, LIST #3 (или LPRINT, LLIST, если нравится).Цитата:
Сообщение от ZXMAK
вообще изначально идея была в том, чтобы сделать стандартный бейсик работающим в текстовой консоли. Например в текстовом режиме ATM/EVO.
Такой режим конечно не у всех есть, а пропатченый образ ПЗУ можно разместить в странице ОЗУ замапленой вместо ПЗУ.
Сам вывод вполне прикручивается с неболшим патчем, но как оказалось там еще довольно много жестко прибитых размеров экрана в коде, что затрудняет реализацию такой идеи, т.к. текстовая консоль предполагает большие размеры, например 80x25, чем 32x24
Да, переделка подучится глобальной. Поэтому, по моему мнению, лучше организовать (через новое или альтернативное ПЗУ) свой канал в/в, подключить к нему драйвер консоли, который бы управлялся Esc-последовательностями: переключения экранов, печать символов и куосора и т.д.Цитата:
Сообщение от ZXMAK
нашлась какая-то Rom`ka на 64символа
https://pic.maxiol.com/thumbs2/17490...8098.rom64.png
Velesoft такой rom делал для divmmc, вот пример
https://velesoft.speccy.cz/other/64charromplus3.gif
https://forum.tlienhard.com/phpBB3/d...2bcca6ebecd496
Вообще тема да, интересная, было бы прикольно с бейсика управлять расширенными режимами, 32x24, 40x20, 80x40, 256x192x8, 256x192x256, цвета на точку, 320x200 и т.д.
Всю работу с потоками надо переделывать что бы и диски работали и флешка и прочее...................
Мммммм com-порт из бейсика, передача и приём параметров из ассемблера.........
На таймексе есть загружаемый бейсик-64 под расширенный экран 512х192.
Zebra OS 64.
Можно переделать под tr-dos.
http://ibb.co/album/DVsYDS
http://disk.yandex.ru/d/6D8k55Gptkx1LQ
http://zx-pk.com/forum/viewtopic.php...art=90#p184005
Лучше смотреть в сторону BBC бейсика.
Оно уже есть готовое, вместо прошивки бейсика-128.
http://mdfs.net/Software/Spectrum/BB...cs/Install.htm