Когда я лепил разные демки, то просто заколебался с загрузчиком данных, разбросанных по разным страницам 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
;-----------------------------------------------------------
;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
Комментарии
Отправить комментарий