правильный загрузчик demo для TR-DOS

 

Когда я лепил разные демки, то просто заколебался с загрузчиком данных, разбросанных по разным страницам  128К. Мне надоело переписывать код, поэтому я решил попробовать автосборку кода загрузки с образа TRD.Недостаток кода был один, нет, два: нужно было указывать страницы, и код загрузки был дописан не до конца(boot2-old.a80):

;-----------------------------------------------------------
;add after
;page0b:
; DEFINE pg0
 macro sectors datab,datae
db 1,5,(datae-datab+255)/256
; 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
 ;test 128K
ld hl,$FFFF
ld bc,$7FFD
ld de,$1011
out (c),d:ld (hl),d
out (c),e:ld (hl),e
out (c),d
ld a,(hl):cp d:ret nz
 ld sp,#5FFE
    res 4,(iy+1)
    xor a:out ($FE),a
    ld hl,$5AFF,de,$5AFe,bc,$1B00-1,(hl),0:lddr
;title
; IFUSED tit_b
; di
; ld de,(#5CF4)
; ld hl, #6000
;; ld a,#10,bc,#7FFD:out (c),a
; sectors tit_b,tit_e
; call #3d13
; call #6000
; ENDIF
;demo
 di
 ld de,(#5CF4)
 ld hl, #6000
 ld a,#10,bc,#7FFD:out (c),a
 sectors begin,end
 call #3d13
IFDEF pg0
 di
 ld de,(#5CF4)
 ld hl, #C000
 sectors page0b,page0e
 call #3d13
ENDIF
IFDEF pg1
 di
 ld de,(#5CF4)
 ld hl, #C000
 ld a,#11,bc,#7FFD:out (c),a
 sectors page1b,page1e
 call #3d13
ENDIF
IFDEF pg3
 di
 ld de,(#5CF4)
 ld hl, #C000
 ld a,#13,bc,#7FFD:out (c),a
 sectors page3b,page3e
 call #3d13
ENDIF
IFDEF pg4
 di
 ld de,(#5CF4)
 ld hl, #C000
 ld a,#14,bc,#7FFD:out (c),a
 sectors page4b,page4e
 call #3d13
ENDIF
 ld a,#10,bc,#7ffd:out (c),a
 jp begin

 db "fuckhype"
 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
;+128K
db ":",245 ;:PRINT
db 34,17,0,16,7,"128K only",34
 
 db #0D;)
 db #80
 db #AA,1,0;;;;;;;;;;;;;autorun line,change program length to -4, e.g. 83-4=79
EndLine2:
EndBasic:
 ENDMODULE
display /d,end-begin
    EMPTYTRD "dust.trd" ;create empty TRD image
SAVETRD "dust.trd", "boot.B", boot.Basic, boot.EndBasic - boot.Basic
; IFUSED tit_b
;    SAVETRD "dust.trd","pict.C",tit_b,tit_e-tit_b
; ENDIF
    SAVETRD "dust.trd","demo.C",begin,end-begin
IFDEF pg0
    PAGE 0
    SAVETRD "dust.trd","pg0.C",page0b,page0e-page0b
ENDIF
IFDEF pg1
    PAGE 1
    SAVETRD "dust.trd","pg1.C",page1b,page1e-page1b
ENDIF
IFDEF pg3
    PAGE 3
    SAVETRD "dust.trd","pg3.C",page3b,page3e-page3b
ENDIF
IFDEF pg4
    PAGE 4
    SAVETRD "dust.trd","pg4.C",page4b,page4e-page4b
ENDIF
;-----------------------------------------------------------
Для каждой страницы указывалась DEFINE pg0, после чего сборка проходила без всяких проблем. Для сборки trd этот исходник добавлялся к концу исходника демо.

И эта поделка так бы и провалялась, но я увидел этот древний текст на github'e одного дурачка, мнившего себя ранимым и гениальным кодером. Я решил попробовать переписать код.
boot2_1-pre.a80 - первый набросок
boot2_2-fix.a80 - правка с учетом ошибок.
Попробовал сборку на готовой демо и застрял - выходит какая-то хрень, даже страница 7 то определяется, то нет. Весь код был сделан под sjasm 1.07 RC7 - давно пора переходить на новую версию.
Я переписал код заново(boot2_3-fin.a80):
;это работает
;-----------------------------------------------------------
 MODULE boot
MACRO trload mema,fsize
    ld hl,mema
    ; ld bc,5+fsize*256
    db 1,5,(fsize+255)/256
    ld de,(#5CF4)
    call $3d13
ENDM
MACRO setpage num
ld a,num,bc,#7FFD:out (c),a
ENDM

Basic:
 db #00,#01;номер строки
 DW EndLine1 - Line1
Line1:
 db #EA;REM

di

 ;test 128K
ld hl,$FFFF
ld bc,$7FFD
ld de,$1011
out (c),d:ld (hl),d
out (c),e:ld (hl),e
out (c),d
ld a,(hl):cp d:ret nz

ld sp,#5FFF
    res 4,(iy+1)
    xor a:out ($FE),a
    ld hl,$5AFF,de,$5AFe,bc,$1B00-1,(hl),0:lddr

;title
; IFUSED tit_b
; di
; ld de,(#5CF4)
; ld hl, #6000
;; ld a,#10,bc,#7FFD:out (c),a
; sectors tit_b,tit_e
; call #3d13
; call #6000
; ENDIF

;demo
 di
 ld a,#10,bc,#7FFD:out (c),a
 ;setpage $10
 trload begin,end-begin
;` jr $


  LUA ALLPASS
sj.insert_label("_pg0", sj.get_label("page0b"))
sj.insert_label("_pg1", sj.get_label("page1b"))
sj.insert_label("_pg3", sj.get_label("page3b"))
sj.insert_label("_pg4", sj.get_label("page4b"))
sj.insert_label("_pg6", sj.get_label("page6b"))
sj.insert_label("_pg7", sj.get_label("page7b"))
ENDLUA

display _pg0
display _pg1
display _pg3
display _pg4
display _pg6
display /d,_pg7

IF _pg0 !=-1
setpage $10
trload page0b,page0e-page0b
ENDIF

IF _pg1 !=-1
setpage $11
trload page1b,page1e-page1b
ENDIF

IF _pg3 !=-1
setpage $13
trload page3b,page3e-page3b
ENDIF

IF _pg4 !=-1
setpage $14
trload page4b,page4e-page4b
ENDIF

IF _pg6 !=-1
setpage $16
trload page6b,page6e-page6b
ENDIF

IF _pg7 !=-1
setpage $17
trload page7b,page7e-page7b
ENDIF

 ld a,#10,bc,#7ffd:out (c),a
 ;setpage $10
 jp begin


; db "fuckhype"
 db #0D
EndLine1:
 db #00,#02
 
; display EndLine1
 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

;+128K
db ":",245 ;:PRINT
db 34,17,0,16,7,"128K only",34
 
 db #0D
 db #80
 db #AA,1,0;;;;;;;;;;;;;autorun line,change program length to -4, e.g. 83-4=79
EndLine2:
EndBasic:
 ENDMODULE

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

; IFUSED tit_b
;    SAVETRD "dust.trd","pict.C",tit_b,tit_e-tit_b
; ENDIF

    SAVETRD "dust.trd","demo.C",begin,end-begin

IF _pg0 != -1
    PAGE 0
    SAVETRD "dust.trd","pg0.C",page0b,page0e-page0b
ENDIF

IF _pg1 != -1
    PAGE 1
    SAVETRD "dust.trd","pg1.C",page1b,page1e-page1b
ENDIF

IF _pg3 != -1
    PAGE 3
    SAVETRD "dust.trd","pg3.C",page3b,page3e-page3b
ENDIF

IF _pg4 != -1
    PAGE 4
    SAVETRD "dust.trd","pg4.C",page4b,page4e-page4b
ENDIF

IF _pg6 != -1
    PAGE 6
    SAVETRD "dust.trd","pg6.C",page6b,page6e-page6b
ENDIF

IF _pg7 != -1
    PAGE 7
    SAVETRD "dust.trd","pg7.C",page7b,page7e-page7b
ENDIF
;-----------------------------------------------------------
Нужно только исправить имя создаваемого образа .trd.Проверил только на демо со страницами 0,1,3,4,5. 

Дополнение. boot2_4-fin.a80 - исправления для создаваемого образа .trd

Комментарии