From 6e2256d0a71b23e9bbd364698423d5725b0b32cc Mon Sep 17 00:00:00 2001 From: Peter Weingartner Date: Sun, 25 Aug 2024 18:45:50 -0400 Subject: [PATCH] Boot screen --- misc/TaskList.ods | Bin 0 -> 15898 bytes samples/boot/BootIcon.aseprite | Bin 0 -> 2340 bytes samples/boot/BootIcon.txt | 294 ++++++++++++++++++++++ samples/boot/boot_clut.s | 257 +++++++++++++++++++ samples/boot/boot_icon.s | 33 +++ samples/boot/build_boot.bat | 1 + samples/boot/extract_clut.py | 24 ++ samples/boot/extract_indicies.py | 31 +++ samples/boot/sample_boot.bin | Bin 0 -> 2133 bytes samples/boot/sample_boot.lst | 406 +++++++++++++++++++++++++++++++ samples/boot/sample_boot.s | 56 +++++ src/boot.c | 158 ++++++++---- src/toolbox.c | 4 +- 13 files changed, 1215 insertions(+), 49 deletions(-) create mode 100644 misc/TaskList.ods create mode 100644 samples/boot/BootIcon.aseprite create mode 100644 samples/boot/BootIcon.txt create mode 100644 samples/boot/boot_clut.s create mode 100644 samples/boot/boot_icon.s create mode 100644 samples/boot/build_boot.bat create mode 100644 samples/boot/extract_clut.py create mode 100644 samples/boot/extract_indicies.py create mode 100644 samples/boot/sample_boot.bin create mode 100644 samples/boot/sample_boot.lst create mode 100644 samples/boot/sample_boot.s diff --git a/misc/TaskList.ods b/misc/TaskList.ods new file mode 100644 index 0000000000000000000000000000000000000000..ac8d67f271cb862979dab96b1661792fe26ed3e0 GIT binary patch literal 15898 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%0Dv{< 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 M?}JV@*YCUk2i1RJsQ>@~ literal 0 HcmV?d00001 diff --git a/samples/boot/BootIcon.aseprite b/samples/boot/BootIcon.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..e597f5b1c2c4182d406bf1b3afd3453d731734ec GIT binary patch literal 2340 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 literal 0 HcmV?d00001 diff --git a/samples/boot/sample_boot.lst b/samples/boot/sample_boot.lst new file mode 100644 index 0000000..492d5d1 --- /dev/null +++ b/samples/boot/sample_boot.lst @@ -0,0 +1,406 @@ + +; 64tass Turbo Assembler Macro V1.58.2974 listing file +; 64tass -b --list sample_boot.lst -o sample_boot.bin sample_boot.s +; Sat Aug 24 16:48:34 2024 + +;Offset ;PC ;Hex ;Monitor ;Source + +;****** Processing input file: sample_boot.s + +=$f04000 vky_text = $f04000 +=$f01000 vky_mst_ctrl_0 = $f01000 +>0000 f40000 f8 16 header: .byte $f8, $16 ; Signature +>0002 f40002 00 .byte 0 ; Version +>0003 f40003 1b 00 f4 00 .dword start ; Starting address +>0007 f40007 55 04 f4 00 .dword boot_icon_pixels ; Boot Icon pixels (0 = none) +>000b f4000b 55 00 f4 00 .dword boot_icon_clut ; CLUT address (0 = none) +>000f f4000f 73 61 6d 70 6c 65 5f 62 .null "sample_boot" +>0017 f40017 6f 6f 74 00 +.001b f4001b e2 20 sep #$20 start: sep #$20 +.001d f4001d c2 10 rep #$10 rep #$10 +.001f f4001f a9 01 lda #$01 lda #$01 +.0021 f40021 8f 00 10 f0 sta $f01000 sta vky_mst_ctrl_0 +.0025 f40025 a9 20 lda #$20 lda #' ' +.0027 f40027 a2 00 00 ldx #$0000 ldx #0 +.002a f4002a 9f 00 40 f0 sta $f04000,x clrloop1: sta @l vky_text,x +.002e f4002e e8 inx inx +.002f f4002f e0 00 20 cpx #$2000 cpx #$2000 +.0032 f40032 d0 f6 bne $f4002a bne clrloop1 +.0034 f40034 a2 00 00 ldx #$0000 ldx #0 +.0037 f40037 bf 47 00 f4 lda $f40047,x putloop: lda @l message,x +.003b f4003b f0 07 beq $f40044 beq done +.003d f4003d 9f 00 40 f0 sta $f04000,x sta @l vky_text,x +.0041 f40041 e8 inx inx +.0042 f40042 80 f3 bra $f40037 bra putloop +.0044 f40044 ea nop done: nop +.0045 f40045 80 fd bra $f40044 bra done +>0047 f40047 48 65 6c 6c 6f 2c 20 77 message: .null 'Hello, world!' +>004f f4004f 6f 72 6c 64 21 00 + +;****** Processing file: boot_clut.s + +.0055 f40055 boot_icon_clut: +>0055 f40055 00 00 00 ff .byte $00, $00, $00, $ff +>0059 f40059 41 00 00 ff .byte $41, $00, $00, $ff +>005d f4005d 42 00 00 ff .byte $42, $00, $00, $ff +>0061 f40061 42 01 00 ff .byte $42, $01, $00, $ff +>0065 f40065 43 01 00 ff .byte $43, $01, $00, $ff +>0069 f40069 44 01 00 ff .byte $44, $01, $00, $ff +>006d f4006d 44 02 00 ff .byte $44, $02, $00, $ff +>0071 f40071 45 02 00 ff .byte $45, $02, $00, $ff +>0075 f40075 46 03 00 ff .byte $46, $03, $00, $ff +>0079 f40079 48 03 00 ff .byte $48, $03, $00, $ff +>007d f4007d 48 04 00 ff .byte $48, $04, $00, $ff +>0081 f40081 49 04 00 ff .byte $49, $04, $00, $ff +>0085 f40085 4a 05 00 ff .byte $4A, $05, $00, $ff +>0089 f40089 4b 05 00 ff .byte $4B, $05, $00, $ff +>008d f4008d 4b 06 00 ff .byte $4B, $06, $00, $ff +>0091 f40091 4d 06 00 ff .byte $4D, $06, $00, $ff +>0095 f40095 4d 07 00 ff .byte $4D, $07, $00, $ff +>0099 f40099 4e 06 00 ff .byte $4E, $06, $00, $ff +>009d f4009d 4e 07 00 ff .byte $4E, $07, $00, $ff +>00a1 f400a1 50 07 00 ff .byte $50, $07, $00, $ff +>00a5 f400a5 50 08 00 ff .byte $50, $08, $00, $ff +>00a9 f400a9 51 09 00 ff .byte $51, $09, $00, $ff +>00ad f400ad 52 09 00 ff .byte $52, $09, $00, $ff +>00b1 f400b1 53 08 00 ff .byte $53, $08, $00, $ff +>00b5 f400b5 53 09 00 ff .byte $53, $09, $00, $ff +>00b9 f400b9 53 0a 00 ff .byte $53, $0A, $00, $ff +>00bd f400bd 56 09 00 ff .byte $56, $09, $00, $ff +>00c1 f400c1 57 0b 00 ff .byte $57, $0B, $00, $ff +>00c5 f400c5 56 0c 00 ff .byte $56, $0C, $00, $ff +>00c9 f400c9 5b 0a 00 ff .byte $5B, $0A, $00, $ff +>00cd f400cd 58 0d 00 ff .byte $58, $0D, $00, $ff +>00d1 f400d1 5a 0c 00 ff .byte $5A, $0C, $00, $ff +>00d5 f400d5 5b 0d 00 ff .byte $5B, $0D, $00, $ff +>00d9 f400d9 5a 0e 00 ff .byte $5A, $0E, $00, $ff +>00dd f400dd 5c 0b 00 ff .byte $5C, $0B, $00, $ff +>00e1 f400e1 5f 0b 00 ff .byte $5F, $0B, $00, $ff +>00e5 f400e5 5c 0f 00 ff .byte $5C, $0F, $00, $ff +>00e9 f400e9 5d 0f 00 ff .byte $5D, $0F, $00, $ff +>00ed f400ed 5e 10 00 ff .byte $5E, $10, $00, $ff +>00f1 f400f1 60 0a 00 ff .byte $60, $0A, $00, $ff +>00f5 f400f5 60 0d 00 ff .byte $60, $0D, $00, $ff +>00f9 f400f9 60 0f 00 ff .byte $60, $0F, $00, $ff +>00fd f400fd 62 0c 00 ff .byte $62, $0C, $00, $ff +>0101 f40101 63 0c 00 ff .byte $63, $0C, $00, $ff +>0105 f40105 63 0d 00 ff .byte $63, $0D, $00, $ff +>0109 f40109 67 0b 00 ff .byte $67, $0B, $00, $ff +>010d f4010d 67 0c 00 ff .byte $67, $0C, $00, $ff +>0111 f40111 69 0b 00 ff .byte $69, $0B, $00, $ff +>0115 f40115 6a 0b 00 ff .byte $6A, $0B, $00, $ff +>0119 f40119 6f 0b 01 ff .byte $6F, $0B, $01, $ff +>011d f4011d 6f 0f 00 ff .byte $6F, $0F, $00, $ff +>0121 f40121 63 12 00 ff .byte $63, $12, $00, $ff +>0125 f40125 64 12 00 ff .byte $64, $12, $00, $ff +>0129 f40129 66 10 00 ff .byte $66, $10, $00, $ff +>012d f4012d 67 13 00 ff .byte $67, $13, $00, $ff +>0131 f40131 69 10 00 ff .byte $69, $10, $00, $ff +>0135 f40135 68 13 00 ff .byte $68, $13, $00, $ff +>0139 f40139 6a 12 00 ff .byte $6A, $12, $00, $ff +>013d f4013d 6b 13 00 ff .byte $6B, $13, $00, $ff +>0141 f40141 6b 14 00 ff .byte $6B, $14, $00, $ff +>0145 f40145 6c 13 00 ff .byte $6C, $13, $00, $ff +>0149 f40149 70 09 02 ff .byte $70, $09, $02, $ff +>014d f4014d 73 0b 01 ff .byte $73, $0B, $01, $ff +>0151 f40151 71 0d 00 ff .byte $71, $0D, $00, $ff +>0155 f40155 72 0e 00 ff .byte $72, $0E, $00, $ff +>0159 f40159 73 0e 00 ff .byte $73, $0E, $00, $ff +>015d f4015d 74 09 03 ff .byte $74, $09, $03, $ff +>0161 f40161 75 0b 01 ff .byte $75, $0B, $01, $ff +>0165 f40165 76 09 02 ff .byte $76, $09, $02, $ff +>0169 f40169 77 0a 02 ff .byte $77, $0A, $02, $ff +>016d f4016d 7a 0f 00 ff .byte $7A, $0F, $00, $ff +>0171 f40171 7c 0b 05 ff .byte $7C, $0B, $05, $ff +>0175 f40175 71 11 00 ff .byte $71, $11, $00, $ff +>0179 f40179 70 15 00 ff .byte $70, $15, $00, $ff +>017d f4017d 71 14 00 ff .byte $71, $14, $00, $ff +>0181 f40181 77 11 00 ff .byte $77, $11, $00, $ff +>0185 f40185 75 14 00 ff .byte $75, $14, $00, $ff +>0189 f40189 7b 11 00 ff .byte $7B, $11, $00, $ff +>018d f4018d 7a 13 00 ff .byte $7A, $13, $00, $ff +>0191 f40191 7b 13 00 ff .byte $7B, $13, $00, $ff +>0195 f40195 78 14 00 ff .byte $78, $14, $00, $ff +>0199 f40199 7c 12 00 ff .byte $7C, $12, $00, $ff +>019d f4019d 7f 12 00 ff .byte $7F, $12, $00, $ff +>01a1 f401a1 80 0a 03 ff .byte $80, $0A, $03, $ff +>01a5 f401a5 80 0b 05 ff .byte $80, $0B, $05, $ff +>01a9 f401a9 80 0c 01 ff .byte $80, $0C, $01, $ff +>01ad f401ad 81 0e 00 ff .byte $81, $0E, $00, $ff +>01b1 f401b1 82 0f 00 ff .byte $82, $0F, $00, $ff +>01b5 f401b5 84 0c 01 ff .byte $84, $0C, $01, $ff +>01b9 f401b9 84 0d 01 ff .byte $84, $0D, $01, $ff +>01bd f401bd 86 0f 00 ff .byte $86, $0F, $00, $ff +>01c1 f401c1 85 0c 06 ff .byte $85, $0C, $06, $ff +>01c5 f401c5 87 0f 07 ff .byte $87, $0F, $07, $ff +>01c9 f401c9 8a 0a 05 ff .byte $8A, $0A, $05, $ff +>01cd f401cd 88 0d 00 ff .byte $88, $0D, $00, $ff +>01d1 f401d1 89 0e 00 ff .byte $89, $0E, $00, $ff +>01d5 f401d5 8b 0d 00 ff .byte $8B, $0D, $00, $ff +>01d9 f401d9 8c 0b 07 ff .byte $8C, $0B, $07, $ff +>01dd f401dd 8f 0a 05 ff .byte $8F, $0A, $05, $ff +>01e1 f401e1 8c 0d 00 ff .byte $8C, $0D, $00, $ff +>01e5 f401e5 8d 0c 01 ff .byte $8D, $0C, $01, $ff +>01e9 f401e9 8d 0d 00 ff .byte $8D, $0D, $00, $ff +>01ed f401ed 84 10 00 ff .byte $84, $10, $00, $ff +>01f1 f401f1 85 10 00 ff .byte $85, $10, $00, $ff +>01f5 f401f5 8a 11 08 ff .byte $8A, $11, $08, $ff +>01f9 f401f9 92 0a 00 ff .byte $92, $0A, $00, $ff +>01fd f401fd 93 0a 00 ff .byte $93, $0A, $00, $ff +>0201 f40201 90 0a 07 ff .byte $90, $0A, $07, $ff +>0205 f40205 90 0b 07 ff .byte $90, $0B, $07, $ff +>0209 f40209 95 09 01 ff .byte $95, $09, $01, $ff +>020d f4020d 94 0a 00 ff .byte $94, $0A, $00, $ff +>0211 f40211 94 0a 03 ff .byte $94, $0A, $03, $ff +>0215 f40215 97 09 06 ff .byte $97, $09, $06, $ff +>0219 f40219 9c 07 01 ff .byte $9C, $07, $01, $ff +>021d f4021d 9d 06 01 ff .byte $9D, $06, $01, $ff +>0221 f40221 9d 06 02 ff .byte $9D, $06, $02, $ff +>0225 f40225 9f 06 01 ff .byte $9F, $06, $01, $ff +>0229 f40229 99 08 01 ff .byte $99, $08, $01, $ff +>022d f4022d 9b 08 02 ff .byte $9B, $08, $02, $ff +>0231 f40231 98 09 05 ff .byte $98, $09, $05, $ff +>0235 f40235 9f 09 0a ff .byte $9F, $09, $0A, $ff +>0239 f40239 91 12 0a ff .byte $91, $12, $0A, $ff +>023d f4023d 9c 16 0c ff .byte $9C, $16, $0C, $ff +>0241 f40241 99 19 0c ff .byte $99, $19, $0C, $ff +>0245 f40245 a2 06 06 ff .byte $A2, $06, $06, $ff +>0249 f40249 a4 04 03 ff .byte $A4, $04, $03, $ff +>024d f4024d aa 02 05 ff .byte $AA, $02, $05, $ff +>0251 f40251 ab 03 06 ff .byte $AB, $03, $06, $ff +>0255 f40255 ac 02 06 ff .byte $AC, $02, $06, $ff +>0259 f40259 aa 04 08 ff .byte $AA, $04, $08, $ff +>025d f4025d ab 05 0b ff .byte $AB, $05, $0B, $ff +>0261 f40261 ab 07 0c ff .byte $AB, $07, $0C, $ff +>0265 f40265 ae 02 08 ff .byte $AE, $02, $08, $ff +>0269 f40269 af 03 09 ff .byte $AF, $03, $09, $ff +>026d f4026d ae 06 0d ff .byte $AE, $06, $0D, $ff +>0271 f40271 ac 0a 0f ff .byte $AC, $0A, $0F, $ff +>0275 f40275 a9 18 0e ff .byte $A9, $18, $0E, $ff +>0279 f40279 b0 02 09 ff .byte $B0, $02, $09, $ff +>027d f4027d b5 01 0b ff .byte $B5, $01, $0B, $ff +>0281 f40281 ba 00 0d ff .byte $BA, $00, $0D, $ff +>0285 f40285 b4 0d 10 ff .byte $B4, $0D, $10, $ff +>0289 f40289 b9 02 10 ff .byte $B9, $02, $10, $ff +>028d f4028d be 00 10 ff .byte $BE, $00, $10, $ff +>0291 f40291 bd 08 14 ff .byte $BD, $08, $14, $ff +>0295 f40295 b1 16 0f ff .byte $B1, $16, $0F, $ff +>0299 f40299 b5 12 10 ff .byte $B5, $12, $10, $ff +>029d f4029d ab 25 11 ff .byte $AB, $25, $11, $ff +>02a1 f402a1 af 2c 13 ff .byte $AF, $2C, $13, $ff +>02a5 f402a5 c2 01 15 ff .byte $C2, $01, $15, $ff +>02a9 f402a9 c2 04 16 ff .byte $C2, $04, $16, $ff +>02ad f402ad c4 00 15 ff .byte $C4, $00, $15, $ff +>02b1 f402b1 c6 00 17 ff .byte $C6, $00, $17, $ff +>02b5 f402b5 c7 00 16 ff .byte $C7, $00, $16, $ff +>02b9 f402b9 c7 00 17 ff .byte $C7, $00, $17, $ff +>02bd f402bd c4 06 16 ff .byte $C4, $06, $16, $ff +>02c1 f402c1 ca 00 18 ff .byte $CA, $00, $18, $ff +>02c5 f402c5 cc 0f 19 ff .byte $CC, $0F, $19, $ff +>02c9 f402c9 d1 03 1d ff .byte $D1, $03, $1D, $ff +>02cd f402cd d3 00 1f ff .byte $D3, $00, $1F, $ff +>02d1 f402d1 d7 0d 1e ff .byte $D7, $0D, $1E, $ff +>02d5 f402d5 d5 1a 1a ff .byte $D5, $1A, $1A, $ff +>02d9 f402d9 da 01 23 ff .byte $DA, $01, $23, $ff +>02dd f402dd da 03 23 ff .byte $DA, $03, $23, $ff +>02e1 f402e1 da 01 24 ff .byte $DA, $01, $24, $ff +>02e5 f402e5 de 03 25 ff .byte $DE, $03, $25, $ff +>02e9 f402e9 de 02 26 ff .byte $DE, $02, $26, $ff +>02ed f402ed d8 09 20 ff .byte $D8, $09, $20, $ff +>02f1 f402f1 c0 31 15 ff .byte $C0, $31, $15, $ff +>02f5 f402f5 ce 37 16 ff .byte $CE, $37, $16, $ff +>02f9 f402f9 d8 28 18 ff .byte $D8, $28, $18, $ff +>02fd f402fd d5 33 17 ff .byte $D5, $33, $17, $ff +>0301 f40301 e6 03 2c ff .byte $E6, $03, $2C, $ff +>0305 f40305 e6 0c 27 ff .byte $E6, $0C, $27, $ff +>0309 f40309 e9 04 2d ff .byte $E9, $04, $2D, $ff +>030d f4030d ee 07 2f ff .byte $EE, $07, $2F, $ff +>0311 f40311 ee 0f 2b ff .byte $EE, $0F, $2B, $ff +>0315 f40315 e5 1c 20 ff .byte $E5, $1C, $20, $ff +>0319 f40319 e9 17 24 ff .byte $E9, $17, $24, $ff +>031d f4031d f1 0c 2f ff .byte $F1, $0C, $2F, $ff +>0321 f40321 f1 0f 2d ff .byte $F1, $0F, $2D, $ff +>0325 f40325 f4 0c 31 ff .byte $F4, $0C, $31, $ff +>0329 f40329 fb 1b 2f ff .byte $FB, $1B, $2F, $ff +>032d f4032d f9 17 30 ff .byte $F9, $17, $30, $ff +>0331 f40331 ed 32 1e ff .byte $ED, $32, $1E, $ff +>0335 f40335 f3 22 26 ff .byte $F3, $22, $26, $ff +>0339 f40339 f3 2f 21 ff .byte $F3, $2F, $21, $ff +>033d f4033d fb 22 2c ff .byte $FB, $22, $2C, $ff +>0341 f40341 f9 29 27 ff .byte $F9, $29, $27, $ff +>0345 f40345 fb 29 28 ff .byte $FB, $29, $28, $ff +>0349 f40349 fd 2e 28 ff .byte $FD, $2E, $28, $ff +>034d f4034d ca 47 1b ff .byte $CA, $47, $1B, $ff +>0351 f40351 de 5e 21 ff .byte $DE, $5E, $21, $ff +>0355 f40355 ef 5f 1e ff .byte $EF, $5F, $1E, $ff +>0359 f40359 f0 4b 1d ff .byte $F0, $4B, $1D, $ff +>035d f4035d fb 41 1e ff .byte $FB, $41, $1E, $ff +>0361 f40361 f9 4f 1c ff .byte $F9, $4F, $1C, $ff +>0365 f40365 fd 4b 1b ff .byte $FD, $4B, $1B, $ff +>0369 f40369 fe 4b 1b ff .byte $FE, $4B, $1B, $ff +>036d f4036d fe 49 1c ff .byte $FE, $49, $1C, $ff +>0371 f40371 fe 40 20 ff .byte $FE, $40, $20, $ff +>0375 f40375 ff 60 14 ff .byte $FF, $60, $14, $ff +>0379 f40379 fd 66 18 ff .byte $FD, $66, $18, $ff +>037d f4037d ff 6e 11 ff .byte $FF, $6E, $11, $ff +>0381 f40381 ff 7a 0f ff .byte $FF, $7A, $0F, $ff +>0385 f40385 fe 71 13 ff .byte $FE, $71, $13, $ff +>0389 f40389 fb 71 1d ff .byte $FB, $71, $1D, $ff +>038d f4038d ea 67 21 ff .byte $EA, $67, $21, $ff +>0391 f40391 e2 70 26 ff .byte $E2, $70, $26, $ff +>0395 f40395 ff 8d 11 ff .byte $FF, $8D, $11, $ff +>0399 f40399 fe 8c 1b ff .byte $FE, $8C, $1B, $ff +>039d f4039d ff 95 16 ff .byte $FF, $95, $16, $ff +>03a1 f403a1 fb 8e 23 ff .byte $FB, $8E, $23, $ff +>03a5 f403a5 f1 91 2c ff .byte $F1, $91, $2C, $ff +>03a9 f403a9 f8 9b 2b ff .byte $F8, $9B, $2B, $ff +>03ad f403ad ff a6 1a ff .byte $FF, $A6, $1A, $ff +>03b1 f403b1 fe ac 26 ff .byte $FE, $AC, $26, $ff +>03b5 f403b5 ff b3 23 ff .byte $FF, $B3, $23, $ff +>03b9 f403b9 fa b5 34 ff .byte $FA, $B5, $34, $ff +>03bd f403bd fd bd 31 ff .byte $FD, $BD, $31, $ff +>03c1 f403c1 fe c4 2e ff .byte $FE, $C4, $2E, $ff +>03c5 f403c5 00 00 00 ff .byte $00, $00, $00, $ff +>03c9 f403c9 00 00 00 ff .byte $00, $00, $00, $ff +>03cd f403cd 00 00 00 ff .byte $00, $00, $00, $ff +>03d1 f403d1 00 00 00 ff .byte $00, $00, $00, $ff +>03d5 f403d5 00 00 00 ff .byte $00, $00, $00, $ff +>03d9 f403d9 00 00 00 ff .byte $00, $00, $00, $ff +>03dd f403dd 00 00 00 ff .byte $00, $00, $00, $ff +>03e1 f403e1 00 00 00 ff .byte $00, $00, $00, $ff +>03e5 f403e5 00 00 00 ff .byte $00, $00, $00, $ff +>03e9 f403e9 00 00 00 ff .byte $00, $00, $00, $ff +>03ed f403ed 00 00 00 ff .byte $00, $00, $00, $ff +>03f1 f403f1 00 00 00 ff .byte $00, $00, $00, $ff +>03f5 f403f5 00 00 00 ff .byte $00, $00, $00, $ff +>03f9 f403f9 00 00 00 ff .byte $00, $00, $00, $ff +>03fd f403fd 00 00 00 ff .byte $00, $00, $00, $ff +>0401 f40401 00 00 00 ff .byte $00, $00, $00, $ff +>0405 f40405 00 00 00 ff .byte $00, $00, $00, $ff +>0409 f40409 00 00 00 ff .byte $00, $00, $00, $ff +>040d f4040d 00 00 00 ff .byte $00, $00, $00, $ff +>0411 f40411 00 00 00 ff .byte $00, $00, $00, $ff +>0415 f40415 00 00 00 ff .byte $00, $00, $00, $ff +>0419 f40419 00 00 00 ff .byte $00, $00, $00, $ff +>041d f4041d 00 00 00 ff .byte $00, $00, $00, $ff +>0421 f40421 00 00 00 ff .byte $00, $00, $00, $ff +>0425 f40425 00 00 00 ff .byte $00, $00, $00, $ff +>0429 f40429 00 00 00 ff .byte $00, $00, $00, $ff +>042d f4042d 00 00 00 ff .byte $00, $00, $00, $ff +>0431 f40431 00 00 00 ff .byte $00, $00, $00, $ff +>0435 f40435 00 00 00 ff .byte $00, $00, $00, $ff +>0439 f40439 00 00 00 ff .byte $00, $00, $00, $ff +>043d f4043d 00 00 00 ff .byte $00, $00, $00, $ff +>0441 f40441 00 00 00 ff .byte $00, $00, $00, $ff +>0445 f40445 00 00 00 ff .byte $00, $00, $00, $ff +>0449 f40449 00 00 00 ff .byte $00, $00, $00, $ff +>044d f4044d 00 00 00 ff .byte $00, $00, $00, $ff +>0451 f40451 00 00 00 ff .byte $00, $00, $00, $ff + +;****** Return to file: sample_boot.s + + +;****** Processing file: boot_icon.s + +.0455 f40455 boot_icon_pixels: +>0455 f40455 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>045d f4045d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>046d f4046d 00 00 00 00 00 00 00 00 +>0475 f40475 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>047d f4047d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>048d f4048d 00 00 00 00 00 00 00 00 +>0495 f40495 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>049d f4049d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>04ad f404ad 00 00 00 00 00 00 00 00 +>04b5 f404b5 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $2F, $27, $27, $1D, $14, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>04bd f404bd 00 00 00 00 00 2f 27 27 1d 14 dc 00 00 00 00 00 +>04cd f404cd 00 00 00 00 00 00 00 00 +>04d5 f404d5 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $3D, $3D, $3D, $3D, $3D, $2F, $27, $27, $1D, $14, $13, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>04dd f404dd 00 00 3d 3d 3d 3d 3d 2f 27 27 1d 14 13 dc 00 00 +>04ed f404ed 00 00 00 00 00 00 00 00 +>04f5 f404f5 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $46, $53, $53, $5D, $69, $69, $5D, $53, $3D, $2F, $1D, $14, $09, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>04fd f404fd 00 46 53 53 5d 69 69 5d 53 3d 2f 1d 14 09 dc 00 +>050d f4050d 00 00 00 00 00 00 00 00 +>0515 f40515 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $53, $79, $7A, $88, $90, $91, $8C, $87, $78, $5D, $53, $3D, $27, $14, $09, $09, $00, $00, $00, $00, $00, $00, $00, $00 +>051d f4051d 53 79 7a 88 90 91 8c 87 78 5d 53 3d 27 14 09 09 +>052d f4052d 00 00 00 00 00 00 00 00 +>0535 f40535 00 00 00 00 00 00 00 68 .byte $00, $00, $00, $00, $00, $00, $00, $68, $7B, $92, $A7, $A8, $AA, $A9, $A0, $9C, $8F, $83, $70, $53, $3D, $27, $14, $09, $09, $00, $00, $00, $00, $00, $00, $00 +>053d f4053d 7b 92 a7 a8 aa a9 a0 9c 8f 83 70 53 3d 27 14 09 +>054d f4054d 09 00 00 00 00 00 00 00 +>0555 f40555 00 00 00 00 00 00 53 7b .byte $00, $00, $00, $00, $00, $00, $53, $7B, $93, $BE, $BF, $CE, $C0, $C1, $B7, $B0, $9F, $9A, $86, $77, $53, $3D, $27, $14, $09, $09, $00, $00, $00, $00, $00, $00 +>055d f4055d 93 be bf ce c0 c1 b7 b0 9f 9a 86 77 53 3d 27 14 +>056d f4056d 09 09 00 00 00 00 00 00 +>0575 f40575 00 00 00 00 00 46 79 92 .byte $00, $00, $00, $00, $00, $46, $79, $92, $BE, $CF, $D4, $D5, $D3, $CD, $C3, $B9, $B1, $A6, $95, $82, $6F, $53, $2F, $27, $14, $09, $DC, $00, $00, $00, $00, $00 +>057d f4057d be cf d4 d5 d3 cd c3 b9 b1 a6 95 82 6f 53 2f 27 +>058d f4058d 14 09 dc 00 00 00 00 00 +>0595 f40595 00 00 00 00 3d 53 7a a7 .byte $00, $00, $00, $00, $3D, $53, $7A, $A7, $BF, $D4, $D9, $DA, $D7, $D1, $C9, $C2, $B8, $AC, $9D, $8D, $7C, $64, $46, $37, $1D, $09, $01, $DC, $00, $00, $00, $00 +>059d f4059d bf d4 d9 da d7 d1 c9 c2 b8 ac 9d 8d 7c 64 46 37 +>05ad f405ad 1d 09 01 dc 00 00 00 00 +>05b5 f405b5 00 00 00 00 3d 53 88 a8 .byte $00, $00, $00, $00, $3D, $53, $88, $A8, $CE, $D5, $DA, $DB, $D8, $D2, $CC, $C4, $BB, $AF, $A2, $94, $81, $6D, $57, $48, $27, $14, $09, $01, $00, $00, $00, $00 +>05bd f405bd ce d5 da db d8 d2 cc c4 bb af a2 94 81 6d 57 48 +>05cd f405cd 27 14 09 01 00 00 00 00 +>05d5 f405d5 00 00 00 00 3d 5d 90 aa .byte $00, $00, $00, $00, $3D, $5D, $90, $AA, $C0, $D3, $D7, $D8, $D6, $D0, $CA, $C5, $BC, $B3, $A4, $97, $85, $76, $5E, $4B, $33, $14, $09, $01, $00, $00, $00, $00 +>05dd f405dd c0 d3 d7 d8 d6 d0 ca c5 bc b3 a4 97 85 76 5e 4b +>05ed f405ed 33 14 09 01 00 00 00 00 +>05f5 f405f5 00 00 00 2f 3d 69 91 a9 .byte $00, $00, $00, $2F, $3D, $69, $91, $A9, $C1, $CD, $D1, $D2, $D0, $CB, $C8, $C7, $BA, $B2, $A5, $99, $89, $73, $60, $4D, $39, $1D, $09, $01, $DC, $00, $00, $00 +>05fd f405fd c1 cd d1 d2 d0 cb c8 c7 ba b2 a5 99 89 73 60 4d +>060d f4060d 39 1d 09 01 dc 00 00 00 +>0615 f40615 00 00 00 27 3d 69 8c a0 .byte $00, $00, $00, $27, $3D, $69, $8C, $A0, $B7, $C3, $C9, $CC, $CA, $C8, $C6, $BD, $B6, $AE, $A3, $96, $84, $72, $63, $51, $3C, $1D, $14, $01, $01, $00, $00, $00 +>061d f4061d b7 c3 c9 cc ca c8 c6 bd b6 ae a3 96 84 72 63 51 +>062d f4062d 3c 1d 14 01 01 00 00 00 +>0635 f40635 00 00 00 27 2f 5d 87 9c .byte $00, $00, $00, $27, $2F, $5D, $87, $9C, $B0, $B9, $C2, $C4, $C5, $C7, $BD, $B5, $B4, $AB, $9E, $8E, $7F, $75, $5F, $4E, $3A, $1D, $14, $01, $01, $00, $00, $00 +>063d f4063d b0 b9 c2 c4 c5 c7 bd b5 b4 ab 9e 8e 7f 75 5f 4e +>064d f4064d 3a 1d 14 01 01 00 00 00 +>0655 f40655 00 00 00 1d 27 53 78 8f .byte $00, $00, $00, $1D, $27, $53, $78, $8F, $9F, $B1, $B8, $BB, $BC, $BA, $B6, $B4, $AD, $A1, $98, $8A, $7D, $6E, $67, $4C, $38, $1D, $09, $01, $01, $00, $00, $00 +>065d f4065d 9f b1 b8 bb bc ba b6 b4 ad a1 98 8a 7d 6e 67 4c +>066d f4066d 38 1d 09 01 01 00 00 00 +>0675 f40675 00 00 00 14 27 3d 5d 83 .byte $00, $00, $00, $14, $27, $3D, $5D, $83, $9A, $A6, $AC, $AF, $B3, $B2, $AE, $AB, $A1, $9B, $8B, $7E, $71, $65, $52, $4A, $33, $14, $09, $01, $01, $00, $00, $00 +>067d f4067d 9a a6 ac af b3 b2 ae ab a1 9b 8b 7e 71 65 52 4a +>068d f4068d 33 14 09 01 01 00 00 00 +>0695 f40695 00 00 00 dc 1d 2f 53 70 .byte $00, $00, $00, $DC, $1D, $2F, $53, $70, $86, $95, $9D, $A2, $A4, $A5, $A3, $9E, $98, $8B, $80, $74, $69, $66, $50, $3B, $26, $14, $09, $01, $DC, $00, $00, $00 +>069d f4069d 86 95 9d a2 a4 a5 a3 9e 98 8b 80 74 69 66 50 3b +>06ad f406ad 26 14 09 01 dc 00 00 00 +>06b5 f406b5 00 00 00 00 14 1d 3d 53 .byte $00, $00, $00, $00, $14, $1D, $3D, $53, $77, $82, $8D, $94, $97, $99, $96, $8E, $8A, $7E, $74, $6A, $5A, $4F, $49, $34, $1D, $09, $01, $01, $00, $00, $00, $00 +>06bd f406bd 77 82 8d 94 97 99 96 8e 8a 7e 74 6a 5a 4f 49 34 +>06cd f406cd 1d 09 01 01 00 00 00 00 +>06d5 f406d5 00 00 00 00 13 14 27 3d .byte $00, $00, $00, $00, $13, $14, $27, $3D, $53, $6F, $7C, $81, $85, $89, $84, $7F, $7D, $71, $69, $5A, $4F, $4A, $36, $1D, $14, $09, $01, $01, $00, $00, $00, $00 +>06dd f406dd 53 6f 7c 81 85 89 84 7f 7d 71 69 5a 4f 4a 36 1d +>06ed f406ed 14 09 01 01 00 00 00 00 +>06f5 f406f5 00 00 00 00 dc 09 14 27 .byte $00, $00, $00, $00, $DC, $09, $14, $27, $3D, $53, $64, $6D, $76, $73, $72, $75, $6E, $65, $66, $4F, $4A, $36, $1D, $14, $09, $01, $01, $DC, $00, $00, $00, $00 +>06fd f406fd 3d 53 64 6d 76 73 72 75 6e 65 66 4f 4a 36 1d 14 +>070d f4070d 09 01 01 dc 00 00 00 00 +>0715 f40715 00 00 00 00 00 dc 09 14 .byte $00, $00, $00, $00, $00, $DC, $09, $14, $27, $2F, $46, $57, $5E, $60, $63, $5F, $67, $52, $50, $49, $36, $1D, $14, $09, $01, $01, $DC, $00, $00, $00, $00, $00 +>071d f4071d 27 2f 46 57 5e 60 63 5f 67 52 50 49 36 1d 14 09 +>072d f4072d 01 01 dc 00 00 00 00 00 +>0735 f40735 00 00 00 00 00 00 09 09 .byte $00, $00, $00, $00, $00, $00, $09, $09, $14, $27, $37, $48, $4B, $4D, $51, $4E, $4C, $4A, $3B, $34, $1D, $14, $09, $01, $01, $01, $00, $00, $00, $00, $00, $00 +>073d f4073d 14 27 37 48 4b 4d 51 4e 4c 4a 3b 34 1d 14 09 01 +>074d f4074d 01 01 00 00 00 00 00 00 +>0755 f40755 00 00 00 00 00 00 00 09 .byte $00, $00, $00, $00, $00, $00, $00, $09, $09, $14, $1D, $27, $33, $39, $3C, $3A, $38, $33, $26, $1D, $14, $09, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00 +>075d f4075d 09 14 1d 27 33 39 3c 3a 38 33 26 1d 14 09 01 01 +>076d f4076d 01 00 00 00 00 00 00 00 +>0775 f40775 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $09, $09, $09, $14, $14, $1D, $1D, $1D, $1D, $14, $14, $09, $09, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00 +>077d f4077d 09 09 09 14 14 1d 1d 1d 1d 14 14 09 09 01 01 01 +>078d f4078d 00 00 00 00 00 00 00 00 +>0795 f40795 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $DC, $01, $09, $09, $09, $14, $14, $09, $09, $09, $01, $01, $01, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>079d f4079d 00 dc 01 09 09 09 14 14 09 09 09 01 01 01 dc 00 +>07ad f407ad 00 00 00 00 00 00 00 00 +>07b5 f407b5 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $DC, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>07bd f407bd 00 00 dc 01 01 01 01 01 01 01 01 01 01 dc 00 00 +>07cd f407cd 00 00 00 00 00 00 00 00 +>07d5 f407d5 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $DC, $01, $01, $01, $01, $DC, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>07dd f407dd 00 00 00 00 00 dc 01 01 01 01 dc 00 00 00 00 00 +>07ed f407ed 00 00 00 00 00 00 00 00 +>07f5 f407f5 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>07fd f407fd 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>080d f4080d 00 00 00 00 00 00 00 00 +>0815 f40815 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>081d f4081d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>082d f4082d 00 00 00 00 00 00 00 00 +>0835 f40835 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +>083d f4083d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>084d f4084d 00 00 00 00 00 00 00 00 + +;****** Return to file: sample_boot.s + + +;****** End of listing diff --git a/samples/boot/sample_boot.s b/samples/boot/sample_boot.s new file mode 100644 index 0000000..efedf69 --- /dev/null +++ b/samples/boot/sample_boot.s @@ -0,0 +1,56 @@ + .cpu "65816" + +vky_text = $f04000 +vky_mst_ctrl_0 = $f01000 + +* = $f40000 + +header: .byte $f8, $16 ; Signature + .byte 0 ; Version + .dword start ; Starting address + .dword boot_icon_pixels ; Boot Icon pixels (0 = none) + .dword boot_icon_clut ; CLUT address (0 = none) + + .null "sample_boot" + +; +; The code for the sample +; + +start: sep #$20 + .as + rep #$10 + .xl + + ; Switch to text only mode + + lda #$01 + sta vky_mst_ctrl_0 + + ; Fill the text screen with blanks + + lda #' ' + ldx #0 +clrloop1: sta @l vky_text,x + inx + cpx #$2000 + bne clrloop1 + + ; Write the message to the screen + + ldx #0 +putloop: lda @l message,x + beq done + sta @l vky_text,x + inx + bra putloop + +done: nop + bra done + +message: .null 'Hello, world!' + +; Include the boot icon and boot icon's CLUT to use on the boot screen + +.include "boot_clut.s" +.include "boot_icon.s" \ No newline at end of file diff --git a/src/boot.c b/src/boot.c index 9e5d9b7..7907ea4 100644 --- a/src/boot.c +++ b/src/boot.c @@ -12,11 +12,14 @@ #include "boot.h" #include "memory.h" #include "proc.h" +#include "cartridge.h" #include "dev/fsys.h" -#include "timers.h" +#include "dev/channel.h" +#include "dev/kbd_f256k.h" #include "dev/txt_screen.h" #include "dev/sprites.h" #include "dev/tiles.h" +#include "timers.h" #include "vicky_general.h" #include "rsrc/sprites/boot_sprites.h" #include "rsrc/tiles/boot_tiles.h" @@ -25,9 +28,15 @@ #include const uint32_t boot_record_alignment = 8192; // Number of bytes for boot record alignement -const uint32_t boot_rom_location = 0xf00000; // Location to check for a boot record in ROM +const uint32_t boot_rom_location = 0xf80000; // Location to check for a boot record in ROM const uint32_t boot_cart_location = 0xf40000; // Location to check for a boot record in ROM +const unsigned short kbd_sc_space = 0x0039; +const unsigned short kbd_sc_f1 = 0x003b; +const unsigned short kbd_sc_f3 = 0x003d; +const unsigned short kbd_sc_f5 = 0x003f; +const unsigned short kbd_sc_f7 = 0x0041; + enum boot_src_e { BOOT_SRC_NONE = 0, // Nothing more to check BOOT_SRC_RAM, // Check RAM for a bootable @@ -42,13 +51,13 @@ enum boot_src_e { * */ typedef struct boot_record_s { - char signature1; - char signature2; - uint32_t start_address; - uint8_t version; - uint32_t icon_address; - uint32_t clut_address; - const char * name; + char signature1; // Needs to be $f8 + char signature2; // Needs to be $16 + uint8_t version; // Currently $00 + uint32_t start_address; // Address to start executing (in little-endian format of the 65816) + uint32_t icon_address; // Address of an icon to show (32x32 sprite data, use 0 for no icon) + uint32_t clut_address; // Address of the palette for the icon in Vicky format (0 to use the default) + const char * name; // A display name/command word for the program (not currently used) } boot_record_t, *boot_record_p; /** @@ -63,6 +72,8 @@ static enum boot_src_e boot_chain[] = { BOOT_SRC_ROM, }; +static bool bootable[10]; + /** * @brief A holder for empty arguments list so we have something to point to when starting a binary file * @@ -222,31 +233,6 @@ void boot_icon_highlight(short position) { sprite_clut(position, 0); } -void boot_from(enum boot_src_e device) { - short result = 0; - t_file_info file_info; - - switch(device) { - case BOOT_SRC_SD0: - if (fsys_stat("/sd0/fnxboot.pgz", &file_info) >= 0) { - txt_print(0, "Booting: /sd0/fnxboot.pgz\n"); - proc_run("/sd0/fnxboot.pgz", 0, boot_args); - - } else if (fsys_stat("/sd0/fnxboot.pgx", &file_info) >= 0) { - txt_print(0, "Booting: /sd0/fnxboot.pgx\n"); - result = proc_run("/sd0/fnxboot.pgx", 0, boot_args); - if (result != 0) { - printf("proc_run error: %d\n", result); - } - } - break; - - default: - txt_print(0, "No bootable device is present.\n"); - break; - } -} - const char * boot_source_name(enum boot_src_e device) { switch(device) { case BOOT_SRC_SD0: @@ -262,13 +248,82 @@ const char * boot_source_name(enum boot_src_e device) { return "ROM"; case BOOT_SRC_CARTRIDGE: - return "CARTRIDGE"; + return "Cartridge"; default: return "None"; } } +static void boot_reset_screen() { + // txt_set_mode(0, TXT_MODE_TEXT | TXT_MODE_SPRITE); + *tvky_mstr_ctrl = (uint16_t)(VKY_MCR_TEXT); + + tile_set_assign(0, 0, false); + tile_set_update(0); + + tile_map_assign(0, 0, 0, 0, 0); + tile_map_position(0, 0, 0); + tile_map_enable(0, false); + tile_map_update(0); + + for (int i = 0; i < 5; i++) { + sprite_assign(i, 0, 0, 0); + sprite_position(i, 0, 0); + sprite_enable(i, 0); + } + + // Clear the text screen + txt_clear(0, 2); +} + +void boot_from(enum boot_src_e device, boot_record_p boot_record) { + short result = 0; + t_file_info file_info; + + switch(device) { + case BOOT_SRC_SD0: + if (fsys_stat("/sd0/fnxboot.pgz", &file_info) >= 0) { + txt_print(0, "Booting: /sd0/fnxboot.pgz\n"); + boot_reset_screen(); + proc_run("/sd0/fnxboot.pgz", 0, boot_args); + + } else if (fsys_stat("/sd0/fnxboot.pgx", &file_info) >= 0) { + txt_print(0, "Booting: /sd0/fnxboot.pgx\n"); + boot_reset_screen(); + result = proc_run("/sd0/fnxboot.pgx", 0, boot_args); + if (result != 0) { + printf("proc_run error: %d\n", result); + } + } + break; + + case BOOT_SRC_CARTRIDGE: + case BOOT_SRC_ROM: + case BOOT_SRC_RAM: + txt_print(0, "Booting from "); + txt_print(0, boot_source_name(device)); + txt_print(0, "\n"); + + // Double-check that the boot record is valid before we attempt to boot + if (boot_record != 0) { + if ((boot_record->signature1 == 0xf8) && (boot_record->signature2 == 0x16) && (boot_record->version == 0)) { + // Memory does indeed hold a boot record + boot_reset_screen(); + proc_exec(boot_record->start_address, 0, 0, boot_args); + } + } else { + txt_print(0, "A valid boot record was not found.\n"); + } + + break; + + default: + txt_print(0, "No bootable device is present.\n"); + break; + } +} + /** * @brief Setup the boot screen * @@ -277,6 +332,8 @@ void boot_screen() { enum boot_src_e boot_source = BOOT_SRC_NONE; short i = 0; long jiffies_target = 0; + boot_record_p boot_record[10]; + short boot_position = 0; // txt_set_mode(0, TXT_MODE_TEXT | TXT_MODE_SPRITE); *tvky_mstr_ctrl = (uint16_t)(VKY_MCR_TILE | VKY_MCR_SPRITE | VKY_MCR_GRAPHICS | VKY_MCR_TEXT_OVERLAY | VKY_MCR_TEXT); @@ -318,29 +375,30 @@ void boot_screen() { txt_print(0, "Scanning for bootable devices...\n"); for (short position = 0; position < sizeof(boot_chain) / sizeof(enum boot_src_e); position++) { - boot_record_p boot_record; - + bootable[position] = false; boot_icon(position, boot_chain[position]); - if (is_bootable(boot_chain[position], &boot_record)) { + if (is_bootable(boot_chain[position], &boot_record[position])) { boot_icon_highlight(position); - + bootable[position] = true; + // Assign the boot source to this, if it hasn't already been bound if (boot_source == BOOT_SRC_NONE) { txt_print(0, "Default boot source: "); txt_print(0, boot_source_name(boot_chain[position])); txt_put(0, '\n'); boot_source = boot_chain[position]; + boot_position = position; } // If there is a boot icon specified in the boot record, change to that icon - if (boot_record != 0) { - if (boot_record->icon_address != 0) { - sprite_assign(position, (uint8_t *)(boot_record->icon_address), 0, 0); + if (boot_record[position] != 0) { + if (boot_record[position]->icon_address != 0) { + sprite_assign(position, (uint8_t *)(boot_record[position]->icon_address), 0, 0); // If there is a CLUT defined for the boot record, switch to use that clut - if (boot_record->clut_address != 0) { + if (boot_record[position]->clut_address != 0) { for (i = 0; i < 4 * 256; i++) { - uint8_t * source_clut = (uint8_t *)boot_record->clut_address; + uint8_t * source_clut = (uint8_t *)boot_record[position]->clut_address; VKY_GR_CLUT_2[i] = source_clut[i]; } sprite_clut(position, 2); @@ -350,12 +408,16 @@ void boot_screen() { } } - // Wait some time for user input + txt_print(0, "\nPress SPACE to use default.\n"); + jiffies_target = timers_jiffies() + 60 * 10; while (jiffies_target > timers_jiffies()) { - ; + unsigned short scancode = kbd_get_scancode(); + if (scancode == kbd_sc_space) { + break; + } } // And launch the system - boot_from(boot_source); -} \ No newline at end of file + boot_from(boot_source, boot_record[boot_position]); +} diff --git a/src/toolbox.c b/src/toolbox.c index bb77e35..e82969a 100644 --- a/src/toolbox.c +++ b/src/toolbox.c @@ -518,11 +518,13 @@ int main(int argc, char * argv[]) { // break; // } + // test_kbd(); + boot_screen(); while (1) ; - // test_kbd(); + // printf("Initializing IEC\n"); // result = iec_init();