• avatar VBI
  • 6
Пчела, вонзив стальное жало, не знает, что она пропала… Так и глупцы, пуская яд, не понимают, что творят.

Омар Хайям
нечитаторы мана по ужасм и ниасиляторы ужасм в треде!


;--------------------------------------------------------------------
 macro	sectors datab,datae

 IF low (datae-datab)=0
   db 1,5,high (datae-datab)
 ELSE
   db 1,5,(1+high (datae-datab))
 ENDIF

	endm

 MODULE boot
Basic:
 db #00,#01;номер строки
 DW EndLine1 - Line1
Line1:
 db #EA;REM
 ld sp,#5FE0

 xor a:out ($FE),a
 ld hl,$5AFF,de,$5AFE,bc,6912,(hl),0:lddr
;----------------------------demo------------
 di
;pic
 ld de,(#5CF4)
 ld hl, #4000
 sectors titl_b,titl_e
 call #3d13
;demo
 ld a,#10,bc,#7FFD:out (c),a
 ld de,(#5CF4)
 ld hl, #6000
 sectors begin,end
 call #3d13

;p0
 ld de,(#5CF4)
 ld hl, #C000
 sectors page0b,page0e
 call #3d13

;p1
 ld a,#11,bc,#7FFD:out (c),a
 ld de,(#5CF4)
 ld hl, #C000
 sectors page1b,page1e
 call #3d13
;p3
 ld a,#13,bc,#7FFD:out (c),a
 ld de,(#5CF4)
 ld hl, #C000
 sectors page3b,page3e
 call #3d13
;p4
 ld a,#14,bc,#7FFD:out (c),a
 ld de,(#5CF4)
 ld hl, #C000
 sectors page4b,page4e
 call #3d13
;p6
; ld a,#16,bc,#7FFD:out (c),a
; ld de,(#5CF4)
; ld hl, #C000
; sectors page6b,page6e
; call #3d13
;p7
 ld a,#17,bc,#7FFD:out (c),a
 ld de,(#5CF4)
 ld hl, #DD00
 sectors page7b,page7e
 call #3d13

 jp #6000

 db "AAA-stupid moron"
 db #0D
EndLine1:
 db #00,#02
 DW EndLine2 - Line2
Line2:
 db #20,#FD,#B0
 db #22,#32,#34,#35,#37,#35,#22;clear val "24575"
 db #3A; :
 db #F9,#C0,#28,#35;randomize usr (5+256*peek val "23635"+peek val "23636"
 db #0E,#00,#00,#05,#00,#00,#2B
 db #32,#35,#36
 db #0E,#00,#00,#00,#01,#00,#2A,#BE

 db #B0
 db #22,#32,#33,#36,#33,#36,#22;"23635"
 db #2B;???
 db #BE
 db #B0
 db #22,#32,#33,#36,#33,#35,#22;"23636"
 db #29,#0D;)
 db #80
 db #AA,1,0;;;;;;;;;;;;;autorun line,change program length to -4, e.g. 83-4=79
EndLine2:
EndBasic:
 ENDMODULE

    EMPTYTRD "verita.trd" ;create empty TRD image
	SAVETRD "verita.trd", "boot.B", boot.Basic, boot.EndBasic - boot.Basic

 savetrd "verita.trd","pic.C",titl_b,titl_e-titl_b
 savetrd "verita.trd","demo.C",begin,end-begin
 
 page 0
 savetrd "verita.trd","p0.C",page0b,page0e-page0b



сборка:


sjasmplus man.asm
if errorlevel 1 goto :exit
:exit
pause


Если нужны дополнительные файлы, размер которых не больше 16384 байт, то удобнее раскидать по страницам и сохранять на .TRD непосредственно при сборке.
Если файл не помещается. поможет Writetrd.exe(наверное)
Для 6502 не помешает ссылка на перевод система команд 6502.
А с чего начать? с изучения платформы конечно же. Быстро для Atari и Apple II вряд ли получится.
  • avatar sq
  • 4
Вообще не понимаю, как это работает. Как-то на основе машины времени, я полагаю?
  • avatar elfh
  • 4
Только в Emuzwin можно прогу назад отматывать. Бесценно для дебага.
Про музыку начинал писать Kakos_nonos , надо трясти продолжение :-)
Вам всем спасибо, что такие посты пишите
  • avatar diver4d
  • 1
Спасибо! Надеюсь, будет дополняться топик и прирастать!
В принципе, очевидная тонкость для меня, но возможно кому-то будет полезно. Спасибо!
Да, знаю, конечно)
  • avatar ShaMAN
  • 0
примечание: на стек идут только регистровые пары и данные по 2 байта
Йей! Спасибо!
  • avatar ShaMAN
  • 1
принцип работы стека знаешь? надеюсь, что знаешь)
но на всякий случай — первый пришел, последний ушел.
допустим мы стек бросаем значения
1, 2, 3, 4.
на вершине стека у нас значение 4.
что бы достать значение 1, то надо стек разобрать в обратном порядке — достаем 4,3,2,1
  • avatar ShaMAN
  • 1
я вот для этого написал
Я так понял, там какая-то работа со стеком, но не очень допер, что и как реально работает.

Артем, смотри — объясню как умею и понимаю:
когда процессор встречает команду call <адрес>, то он бросает на стек содержимое регистра PC+3, меняет значение PC на <адрес> и продолжает выполнение. т.е. следующая команда будет браться уже из <адрес>. а когда встречается команда ret, то берется значение с вершины стека и пихается в PC, потом опять же идет продолжение выполнения программы.
командами push/pop ты сохраняешь/восстанавливаешь значения регистров в стек/ из стека. и соответственно косвенно изменяешь значение регистра SP (указатель на вершину стека). и если ты запихал в стек допустим 2 регистра, а восстановил 1, то при выполнении команды ret со стека возьмется что? правильно — хрень! и выполнение программы начнеться по направлению неведомой черной дыры :)
вот как-то так
  • avatar nyuk
  • 1
Ну это не абсолют же. Можно хоронить регистры в самой процедуре. Можно вообще забить. По-всякому оно бывает.
Да, это даже не массив и список структур :) Только у меня последний враг не обработается, ну не суть :)
  • avatar ShaMAN
  • 0
только надо добавить, что в начале процедуры надо push все регистры которые портишь, а перед выхором pop их обратно
  • avatar nyuk
  • 2
(SUB нельзя использовать в качестве имени метки)
  • avatar nyuk
  • 2
Ну вот синтетический пример реализации GOSUB/RETURN. Ничего полезного не делает, но принцип вроде понятен.


	ld a, #01
	call SUB	; вызываем процедуру SUB с параметром #01
	halt
	ld a, #fe
	call SUB	; еще раз вызываем процедуру SUB с параметром #FE

	di : halt	; стоп машина

; Собственно процедурура SUB
; A - параметр, с которым она играется
SUB
	ld b, a
	xor a	; наигрались :-)
	ret	; возвращаемся туда, откуда пришли
Label + defb — это, я так понимаю, и есть массив. О как! УДобно, спассибо!