Код: Выделить всё
; (C) fk0@fk0.pp.ru ~1997-2003
; basic-loader
; set HAVE_TRDOS=N, there N is not 0 if beta-disk present
STDPROG equ 0x5ccb ; при отсутствии TR-DOS адрес другой (!), но тут
; всегда такой, но это может быть не совсем совместимо
; с чиста-кассетными программами.
di
im 1
ld bc, 0x7ffd
xor a
out (c), a ; включается нулёвая банка
ld a, 0x3f
ld i, a
ld iy, 0x5c3a ; iy жизненно нужен для IM1
; обнуляет редактор командной строки и переменные бейсика...
ld hl, 0x5b00
ld de, 0x5b01
ld bc, 0x6000-0x5b00
ld (hl), l
ldir ; самоочевидно
; установка жизненно важных системных переменных
ld hl, 0x3d00+'A'
ld (0x5c7b), hl ; UDG into ROM...
ld hl, 0x0040
ld (0x5c38), hl ; PIP & RASP
ld hl, 0x3c00
ld (0x5c36), hl ; CHARS
ld hl, 0xffff
ld (0x5cb4), hl ; P-RAMT
ld hl, resident - basic ; рамтом меньше FFFF за счёт коротенького
; ассемблерного куска в верхней памяти
; (99% программ нормально пускаются...
; а кто не проверяет RAMTOP сам мудак).
; кусок нужен для окончательного запуска бейсика (см. ниже)
ld (0x5cb2), hl ; RAMTOP
ld (hl), 0x3f ; end marker
; ставиться стек и адрес обработки недопустимых ошибок
dec hl
ld sp, hl
ld hl, 0x1303 ; MAIN-4
push hl
ld hl, 0
add hl, sp
ld (0x5c3d), hl ; ERRSP
; атрибуты экрана и бордюра по-дефолту -- чёрный на сером.
ld a, 0x38
ld (0x5c8d), a ; ATTR_P
ld (0x5c8f), a ; ATTR_T
ld (0x5c48), a ; BORDCR
; скорость ввода с клавитуры
ld hl, 0x0210 ; 0x0523 -- standard
ld (0x5c09), hl ; REPDEL & REPPER (fast)
; какая-то хуета не помню для чего.
dec (iy-0x3a)
dec (iy-0x36) ; KSTATE0,4=0xff
; установка адреса начала бейсик-программы и её переменных --
; кто не понял -- читайте MOA.
ld hl, STDPROG
dec hl
ld (0x5c57), hl ; DATADD
inc hl
ld (0x5c53), hl ; PROG
ex de, hl ; адрес куда её (см. ниже) скопировать
ld hl, basic ; своя бейсик-программа, можно с диска загрузить
ld bc, basic_end-basic ; TODO: real length бейсик программы своей
ldir ; копируетсяа из фиг знает куда куда следует.
ex de, hl
ld (0x5c4b), hl ; VARS
ld (hl), 0x80 ; end of variables marker
inc hl
ld (0x5c59), hl ; E_LINE -- редактор командной строоки
if 0 ; можно свою строку туда загнать
ld (hl), 0x0d
inc hl
ld (hl), 0x80
inc hl
ld (0x5c61), hl
ld (0x5c63), hl
ld (0x5c65), hl ; SET-MIN analog
endc ; ^^^ видимо нах не надо, не помню уже ибо делается вызовом
; SET-MIN из ПЗУ
; короткий кусок копируется в самый конец памяти (ему там отведено путём
; уменьшения RAMTOP) и пускается. Сам он потом пускает бейсик.
ld hl, resident
ld de, resident - basic
push de
ld bc, basic - resident
ldir
ret
; окончательный запуск бейсика.
resident:
ld bc, 0x7ffd
ld a, 0x10
out (c), a ; 0-я банка и 48кб ПЗУ
ld b, 0x1f
xor a
out (c), a ; точно 0-я (для скорпа и кая).
ei ; iy готов, переменные готовы, можно опрашивать клаву
; установка каналов ввода-вывода (экран, принтер и т.п. -- нужное продублировано
; в ПЗУ -- просто копируется в область описателей).
ld hl, 0x5cb6
ld (0x5c4f), hl ; CHANS
ex de, hl
ld hl, 0x15af ; chans in rom-48
ld bc, 21
ldir
ld hl, 0x15c6
ld de, 0x5c10
ld bc, 14
ldir ; initial STREAMS
set 1, (iy+1)
call 0x0edf ; initialize printer
ld (iy+0x31), 2 ; DF_SZ (lower screen size)
call 0x0d6b ; CLS
; хуй знает что оно делает, раньше знал, теперь C#^H^H ктулху сожрал мой моск.
call 0x16b0 ; SET-MIN
dec (iy+0x00) ; ERRNO -- ашибак нет!
set 7, (iy+1) ; running program, not single line
; ! см. выше! так можно и строку запустить вместо
; программы. юзер потом хуй узнает что пускали.
; во! ахтунг. в hl -- команда для интерпретации тр-досом.
; выполняется понятно когда. напоминаю, что адрес начала программ
; всё равно такой как при наличии TR-DOS, так что для абсолютной
; совместимости с 48-м без тр-доса его надо понизить... (см. выше STDPROG)
#if HAVE_TRDOS
; initialize TR-DOS
ld hl, resident - basic + trd_op
ld (0x5c5d), hl
call 15619
trd_op:
db 234, ":", 0x0d ; REM <CR>
#endif
; по-моему сюда доходит только при неопределённом HAVE_TRDOS.
; не знаю уже...
jp 0x1b76 ; start basic program
; моя могучая бейсик-программа. может быть любая. можно хоть с диска
; посекторно загрузить самому... Да, принципиально, что она копируется
; куда надо LDIR'ом. По этому адрес всей этой хренотени должен быть либо
; (включая конец) меньше, либо строго больше STDPROG (уже не включая
; конец, но выше #6000 ибо там (см. выше) всё обнуляется нахрен).
basic:
*Include shadow.s
; пример...
; hello world!
#if 0
BASNUM MACRO _marg1
db "0"
db 0x0e
dw 0
dw _marg1
db 0
ENDM
db 0, 10 ; line no. 10.
dw bsline_end - bsline_start
bsline_start:
db 0xf5, 0x22 ; PRINT
db "Hello World!"
db 0x22
db ':'
db 0xec
BASNUM 10 ; GOTO 10
db 0x0d
bsline_end:
db 0x80
#endif
basic_end:
end