Ну тот же MASM в своё время был/есть очень популярным. Там в итоговой программе родных мнемоник иногда почти и нет. Макросы тема хорошая, но использовать их надо с умом и осторожно. Что касается псевдоязыка, который предложил Trol73, то та же IDA, например, в него "декодирует" дизассемблированный текст. Вполне себе повышает читабельность логики кода. Так что тоже достаточно разумная идея для кроссплатформы.
Последний раз редактировалось Hunta; 25.01.2024 в 16:37.
Сейчас пишу компилятор С-- - подобного языка для 8080/8085. И заодно декомпилятор в него.
Хочется получить возможности ассемблера при Си-подобном синтаксисе.
Под спойлером - результат прогона декомпилятора для одного тетриса (tetris6.gam) под 86РК
Скрытый текст
Код:extern proc biosReadKeyboard() absolute 0xF803 extern proc biosPrintChar(chr: C) absolute 0xF809 extern proc biosPrintMessage(msg: HL) absolute 0xF818 extern proc biosCheckKeyboard() absolute 0xF81B ; Ввод кода нажатой клавиши (A=0FFH - не нажата, A=0FEH - РУС/ЛАТ, ИНАЧЕ - код клавиши) extern proc biosWarmBoot() absolute 0xF86C var byte_1300: byte absolute 0x1300 var byte_1301: byte absolute 0x1301 var byte_1302: byte absolute 0x1302 var byte_1303: byte absolute 0x1303 var word_1305: word absolute 0x1305 var word_1307: word absolute 0x1307 var word_1309: word absolute 0x1309 var byte_130B: byte absolute 0x130B var byte_130C: byte absolute 0x130C var byte_130D: byte absolute 0x130D var byte_130E: byte absolute 0x130E var byte_130F: byte absolute 0x130F var byte_1310: byte absolute 0x1310 var byte_1311: byte absolute 0x1311 var byte_1312: byte absolute 0x1312 var byte_1313: byte absolute 0x1313 var byte_1314: byte absolute 0x1314 var word_1315: word absolute 0x1315 var byte_1317: byte absolute 0x1317 var byte_1318: byte absolute 0x1318 var byte_1319: byte absolute 0x1319 var word_1320: word absolute 0x1320 var byte_1322: byte absolute 0x1322 var byte_1323: byte absolute 0x1323 var byte_1326: byte absolute 0x1326 var word_1327: word absolute 0x1327 var byte_1329: byte absolute 0x1329 var word_132A: word absolute 0x132A var word_132C: word absolute 0x132C var byte_132E: byte absolute 0x132E var byte_132F: byte absolute 0x132F var byte_1338: byte absolute 0x1338 proc start() { SP = 0x75FF DE = 0x03F6 CALL proc_0350 byte_132E = A = 0 BC = 0x100A CALL proc_056F word_1305 = HL = 0x0100 @proc_0019: HL = 0x1330 JMP proc_079D } data_001F: byte[] { 0x00, 0x4E, 0x00, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x9C, 0x00, 0xB2, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x04, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x9C, 0x00, 0xB2, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x4E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x02, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0x4C, 0x00, 0x4E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x02, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0x50, 0x00, 0x4E, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x4C, 0x00, 0xFE, 0xFF, 0xB2, 0xFF, 0x00, 0x00, 0x50, 0x00, 0x4E, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x4C, 0x00, 0xFE, 0xFF, 0xB2, 0xFF, 0x00, 0x00, 0x4C, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x50, 0x00, 0x4E, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0xB4, 0xFF, 0x00, 0x00, 0x4E, 0x00, 0xB0, 0xFF, 0xB2, 0xFF, 0x00, 0x00, 0x50, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0xB4, 0xFF, 0xB2, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xB0, 0xFF, 0x00, 0x00, 0x4C, 0x00, 0x4E, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0x4E, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x02, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0x4E, 0x00, 0xFE, 0xFF, 0xB2, 0xFF, 0x00, 0x00 } proc proc_0100() { word_1307 = HL = 0x7824 word_1309 = HL XCHG byte_1319 = A = 0x14 byte_1311 = A = 0 byte_1312 = A CALL proc_021F CALL proc_024A byte_132F = A CALL proc_021F CALL proc_025E A = byte_132F CPI 0x2E JNZ proc_032E HL = 0x7ACE BC = 0x0802 lbl_0133: M = 0x20 HL++ B-- JNZ lbl_0133 B = 0x08 HL = 0x7B1C C-- JNZ lbl_0133 A = byte_1317 A |= A JNZ lbl_0153 DE = 0x7AD0 CALL proc_0228 CALL proc_025E lbl_0153: byte_130D = A = byte_130F byte_130E = A = byte_1310 byte_130C = A = 0 lbl_0163: HL = 0x130D A++ CMP M CZ proc_017B HL = 0x130E CMP M CZ proc_02BF C = 0xFF lbl_0174: C-- JNZ lbl_0174 JMP lbl_0163 } proc proc_017B() { PUSH PSW M++ A = 0xFF byte_130B = A CALL biosCheckKeyboard CPI 0xFF JZ proc_02BD B = A HL = 0x130D A = byte_130F A += M M = A A = B CPI 0x08 JZ proc_01E1 CPI 0x18 JZ proc_01EC CPI 0x1A JZ proc_01F7 CPI 0x19 JZ proc_0207 HL = word_1307 XCHG CALL proc_021F CALL proc_027F lbl_01B2: CALL proc_021F HL = 0x004E HL += DE XCHG A = byte_1319 A-- byte_1319 = A CALL proc_024A CPI 0x2E JZ lbl_01B2 CALL proc_021F HL = 0xFFB2 HL += DE word_1307 = HL XCHG A = byte_1319 A++ byte_1319 = A CALL proc_025E JMP proc_02BD } proc proc_01E1() { HL = word_1307 HL-- HL-- word_1309 = HL JMP proc_028C } proc proc_01EC() { HL = word_1307 HL++ HL++ word_1309 = HL JMP proc_028C } proc proc_01F7() { A = byte_1311 A++ CPI 0x04 JM lbl_0201 A = 0 lbl_0201: byte_1312 = A JMP proc_028C } proc proc_0207() { CALL biosPrintChar(0x07) A = byte_1317 A -= 0x04 byte_1317 = A JZ proc_02BD A = 0x04 byte_1317 = A JMP proc_02BD } proc proc_021F() { A = byte_1311 byte_1313 = A JMP proc_0234 } proc proc_0228() { A = byte_1300 JMP proc_0237 } proc proc_022E() { A = byte_1312 byte_1313 = A @proc_0234: A = byte_1301 @proc_0237: RRC RRC RRC A &= 0xE0 C = A A = byte_1313 RLC RLC RLC A &= 0x1F A += C C = A B = 0 RET } proc proc_024A() { A = mem[BC] L = A C++ A = mem[BC] H = A C++ HL += DE A = M CPI 0x2E RNZ A = C A &= 0x07 JNZ proc_024A A = 0x2E RET } proc proc_025E() { byte_1302 = A = 0x17 byte_1303 = A = 0x11 @proc_0268: L = A = mem[BC] C++ H = A = mem[BC] C++ HL += DE M = A = byte_1302 HL++ M = A = byte_1303 A = C A &= 0x07 JNZ proc_0268 RET } proc proc_027F() { byte_1302 = A = 0x2E byte_1303 = A = 0x20 JMP proc_0268 } proc proc_028C() { HL = word_1307 XCHG CALL proc_021F CALL proc_027F HL = word_1309 XCHG CALL proc_022E CALL proc_024A CPI 0x2E JNZ lbl_02B3 XCHG word_1307 = HL byte_130B = A = 0 byte_1311 = A = byte_1312 lbl_02B3: CALL proc_021F HL = word_1307 XCHG CALL proc_025E @proc_02BD: POP PSW RET } proc proc_02BF() { PUSH PSW A = byte_1310 A += M byte_130E = A HL = word_1307 XCHG HL = 0x004E HL += DE word_1309 = HL CALL proc_021F CALL proc_027F HL = word_1309 XCHG A = C A -= 0x08 C = A CALL proc_024A CPI 0x2E JNZ proc_02FB XCHG word_1307 = HL A = byte_1319 A-- byte_1319 = A @proc_02F3: CALL proc_021F CALL proc_025E POP PSW RET } proc proc_02FB() { A = byte_130B A |= A JNZ proc_0316 @proc_0302: HL = word_1307 XCHG JMP proc_02F3 } data_0309: byte[] { 0x2A, 0x07, 0x13, 0xEB, 0xCD, 0x1F, 0x02, 0xCD, 0x7F, 0x02, 0xC3, 0xB3, 0x02 } proc proc_0316() { A = byte_130C A |= A JNZ proc_0324 A++ byte_130C = A JMP proc_0302 } proc proc_0324() { HL = word_1307 XCHG CALL proc_021F CALL proc_025E @proc_032E: SP = 0x75FF JMP proc_0836 } proc proc_0334() { HL = word_1305 C = 0x10 lbl_0339: A = H HL += HL A &= 0x60 JPE lbl_0341 HL++ lbl_0341: C-- JNZ lbl_0339 word_1305 = HL A = H A += L A &= 0x07 JZ proc_0334 RET } proc proc_0350() { C = 0x1F PUSH DE CALL biosPrintChar POP DE HL = 0x7997 B = 0x07 A = mem[DE] DE++ byte_1318 = A lbl_0361: PUSH BC BC = 0x0808 lbl_0365: A = mem[DE] DE++ PUSH DE E = A A = byte_1318 D = A A = E lbl_036E: RAL JNC lbl_0373 M = D lbl_0373: HL++ C-- JNZ lbl_036E C = 0x08 POP DE B-- JNZ lbl_0365 POP BC B-- RZ C = 0x0E lbl_0384: HL++ C-- JNZ lbl_0384 JMP lbl_0361 } proc proc_038C() { CALL biosPrintChar(0x1F) D = 0x15 lbl_0393: PUSH DE CALL proc_0577 BC = 0x0B18 CALL proc_056F POP DE D-- JZ proc_03AD PUSH DE CALL biosPrintMessage(0x045D) POP DE JMP lbl_0393 } proc proc_03AD() { CALL biosPrintMessage(0x0474) CALL biosPrintChar(0x0C) RET } proc proc_03B9() { HL = 0x7885 DE = 0x048B CALL proc_03ED HL = 0x791E CALL proc_03ED HL = 0x796C CALL proc_03ED HL = 0x79BA CALL proc_03ED HL = 0x7A08 CALL proc_03ED HL = 0x7BDC CALL proc_03ED HL = 0x7C78 CALL proc_03ED HL = 0x7D14 CALL proc_03ED RET } proc proc_03ED() { A = mem[DE] DE++ A |= A RZ M = A HL++ JMP proc_03ED } data_03F6: byte[] { 0x40, 0x00, 0x78, 0xFE, 0x18, 0x42, 0x18, 0x42, 0x00, 0x00, 0x84, 0x10, 0x24, 0x44, 0x24, 0x42, 0x00, 0x00, 0x80, 0x10, 0x42, 0x48, 0x42, 0x42, 0x00, 0x00, 0x80, 0x10, 0x42, 0x70, 0x42, 0x7E, 0x00, 0x00, 0x80, 0x10, 0x7E, 0x48, 0x7E, 0x42, 0x00, 0x00, 0x84, 0x10, 0x42, 0x44, 0x42, 0x42, 0x00, 0x00, 0x78, 0x10, 0x42, 0x42, 0x42, 0x42, 0x00, 0x0D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, 0x7B, 0x65, 0x20, 0x69, 0x6D, 0x71, 0x20, 0x3F, 0x20, 0x00, 0x0D, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, 0x7B, 0x20, 0x72, 0x61, 0x6E, 0x67, 0x20, 0x28, 0x30, 0x2D, 0x39, 0x29, 0x20, 0x3F, 0x20, 0x00, 0x11, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x2E, 0x20, 0x11, 0x00, 0x15, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x11, 0x00, 0x75, 0x70, 0x72, 0x61, 0x77, 0x6C, 0x65, 0x6E, 0x69, 0x65, 0x00, 0x1D, 0x20, 0x2D, 0x20, 0x73, 0x64, 0x77, 0x69, 0x67, 0x20, 0x77, 0x6C, 0x65, 0x77, 0x6F, 0x00, 0x0E, 0x20, 0x2D, 0x20, 0x73, 0x64, 0x77, 0x69, 0x67, 0x20, 0x77, 0x70, 0x72, 0x61, 0x77, 0x6F, 0x00, 0x0F, 0x20, 0x2D, 0x20, 0x70, 0x6F, 0x77, 0x6F, 0x72, 0x6F, 0x74, 0x00, 0x0B, 0x20, 0x2D, 0x20, 0x70, 0x6F, 0x6B, 0x61, 0x7A, 0x61, 0x74, 0x78, 0x20, 0x73, 0x6C, 0x65, 0x64, 0x75, 0x60, 0x7D, 0x60, 0x60, 0x00, 0x77, 0x73, 0x65, 0x67, 0x6F, 0x20, 0x6F, 0x7E, 0x6B, 0x6F, 0x77, 0x20, 0x20, 0x2D, 0x00, 0x72, 0x61, 0x6E, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2D, 0x00, 0x70, 0x6F, 0x6C, 0x6E, 0x79, 0x68, 0x20, 0x73, 0x74, 0x72, 0x6F, 0x6B, 0x20, 0x2D, 0x00 } proc proc_0507() { HL = 0x7DE6 word_132A = HL B = 0x14 @proc_050F: C = 0x0A lbl_0511: A = M CPI 0x2E JZ proc_0526 HL++ HL++ C-- JNZ lbl_0511 CALL proc_0535 HL = word_132A JMP proc_050F } proc proc_0526() { DE = 0xFFB2 HL = word_132A HL += DE word_132A = HL B-- JNZ proc_050F RET } proc proc_0535() { PUSH BC A = byte_1314 A++ byte_1314 = A HL = word_132A word_132C = HL B-- lbl_0544: C = 0x14 HL = word_132C XCHG HL = 0xFFB2 HL += DE word_132C = HL lbl_0551: A = M mem[DE] = A DE++ HL++ C-- JNZ lbl_0551 B-- JNZ lbl_0544 HL = word_132C DE = 0x2E20 C = 0x0A lbl_0565: M = D HL++ M = E HL++ C-- JNZ lbl_0565 POP BC RET } proc proc_056F() { CALL biosPrintChar B-- JNZ proc_056F RET } proc proc_0577() { CALL biosPrintChar(0x0A) JMP biosPrintChar(0x0D) } proc proc_0581() { A = byte_1314 A++ B = A A = byte_1338 A++ C = A A = 0 lbl_058C: A += 0x0A C-- JNZ lbl_058C CMP B RP A = byte_1338 CPI 0x09 RZ A++ byte_1338 = A JMP biosPrintChar(0x07) } proc proc_05A3() { A = byte_1319 HL = 0x1338 A += M A += M A += M HL = 0x1317 A += M E = A D = 0 HL = word_1315 HL += DE word_1315 = HL RET } proc proc_05BB() { word_1327 = HL XCHG byte_1326 = A = 0 byte_1329 = A = H lbl_05C7: E = 0 B = 0x10 A |= A lbl_05CC: A = L RAL L = A A = H RAL H = A A = E RAL E = A A -= 0x0A CMC JNC lbl_05DC E = A lbl_05DC: B-- JNZ lbl_05CC RAL A &= 0x01 HL += HL A |= L L = A A = E A += 0x30 CALL proc_05FE A = H A |= L JNZ lbl_05C7 A = byte_1329 A |= A JP lbl_05FD A = 0x2D CALL proc_05FE lbl_05FD: RET } proc proc_05FE() { PUSH HL C = A HL = word_1327 D = H E = L HL++ word_1327 = HL A = byte_1326 A |= A JZ lbl_061B B = A lbl_0611: XCHG A = M XCHG M = A HL-- DE-- B-- JNZ lbl_0611 lbl_061B: M = A = C A = byte_1326 A++ byte_1326 = A HL-- M = A POP HL RET } proc proc_0628() { B = M HL++ lbl_062A: A = M mem[DE] = A HL++ DE++ B-- JNZ lbl_062A RET } proc proc_0633() { HL = 0x1330 B = 0x08 @proc_0638: PUSH HL @proc_0639: CALL biosReadKeyboard() C = A CPI 0x08 JZ proc_0657 CPI 0x0D JZ proc_0666 CPI 0x20 JM proc_0639 CALL biosPrintChar POP HL M = C HL++ B-- JNZ proc_0638 RET } proc proc_0657() { A = B CPI 0x08 JP proc_0639 CALL biosPrintChar POP HL HL-- B++ JMP proc_0638 } proc proc_0666() { POP HL lbl_0667: M = 0x20 HL++ B-- JNZ lbl_0667 RET } proc proc_066F() { HL = 0x1000 A = byte_132E A++ E = A D = 0x01 @proc_0679: A = D CPI 0x0A JP proc_06D2 C = 0x20 A += 0x30 B = A @proc_0684: CALL proc_078A C = B CALL proc_078A C = 0x2E CALL proc_078A CALL proc_0788 B = 0x08 CALL proc_077E CALL proc_0792 A = M HL++ A += 0x30 C = A CALL proc_078A CALL proc_0792 B = 0x06 HL++ CALL proc_077E CALL proc_0792 BC = 0x0308 CALL proc_0795 A = byte_1322 CMP D JNZ lbl_06C4 C = 0x2A CALL proc_078A CALL proc_078A lbl_06C4: D++ A = D CMP E RP PUSH HL PUSH DE CALL proc_0577 POP DE POP HL JMP proc_0679 } proc proc_06D2() { C = 0x31 A += 0x26 B = A JMP proc_0684 } proc proc_06DA() { A = byte_132E A |= A JNZ proc_06EE A++ byte_132E = A DE = 0x1000 HL = 0x1330 JMP proc_0773 } proc proc_06EE() { B = A B++ C = 0 @proc_06F2: DE = 0x1339 HL = 0x1000 A = C RLC RLC RLC RLC A += 0x09 L = A A = mem[DE] CMP M JZ proc_072E JM proc_073C @proc_0708: A = L A &= 0xF0 L = A word_1320 = HL A = C A++ byte_1322 = A CALL proc_0760 HL = word_1320 XCHG @proc_071B: HL = 0x1330 B = 0x10 CALL proc_0775 A = byte_132E CPI 0x0F RZ A++ byte_132E = A RET } proc proc_072E() { A = M @proc_072F: HL++ DE++ byte_1323 = A A = mem[DE] CMP M JZ proc_0756 JP proc_0708 @proc_073C: C++ A = B CMP C JNZ proc_06F2 C-- A = byte_132E CPI 0x0F JNZ proc_0708 DE = 0x10E0 A = 0x0F byte_1322 = A JMP proc_071B } proc proc_0756() { A = byte_1323 A-- JNZ proc_072F JMP proc_073C } proc proc_0760() { HL = 0x10EF DE = 0x10FF lbl_0766: A = M mem[DE] = A HL-- DE-- A = word_1320 A-- CMP L JNZ lbl_0766 RET } proc proc_0773() { B = 0x10 @proc_0775: A = M mem[DE] = A HL++ DE++ B-- JNZ proc_0775 RET } proc proc_077E() { C = M HL++ CALL proc_078A B-- JNZ proc_077E RET } proc proc_0788() { C = 0x20 @proc_078A: PUSH HL PUSH DE CALL biosPrintChar POP DE POP HL RET } proc proc_0792() { BC = 0x0520 @proc_0795: PUSH HL PUSH DE CALL proc_056F POP DE POP HL RET } proc proc_079D() { BC = 0x1020 lbl_07A0: M = C HL++ B-- JNZ lbl_07A0 CALL biosPrintMessage(0x042F) CALL proc_0633 CALL biosPrintMessage(0x0443) lbl_07B5: CALL biosReadKeyboard() C = A A -= 0x30 JM lbl_07B5 CPI 0x0A JP lbl_07B5 byte_1338 = A CALL proc_038C word_1315 = HL = 0 byte_1314 = A = 0 byte_1317 = A = 0x04 CALL proc_03B9 CALL proc_0334 byte_1300 = A @proc_07E1: A = byte_1338 HL = 0x7C88 A += 0x30 M = A HL = 0x131A E = A = byte_1314 D = 0 CALL proc_05BB HL = 0x131A DE = 0x7D24 CALL proc_0628 DE = 0x1339 HL = word_1315 XCHG CALL proc_05BB HL = 0x1339 DE = 0x7BEC CALL proc_0628 byte_1301 = A = byte_1300 CALL proc_0334 byte_1300 = A A = 0x5A HL = 0x1338 A -= M A -= M A -= M A -= M A -= M A -= M byte_1310 = A A = 0x50 A -= M A -= M byte_130F = A JMP proc_0100 } proc proc_0836() { CALL proc_0507 CALL proc_0581 CALL proc_05A3 A = byte_132F CPI 0x2E JZ proc_07E1 CALL proc_06DA CALL biosPrintMessage(0x0882) CALL proc_0577 CALL proc_066F CALL biosPrintMessage(0x086E) lbl_085C: CALL biosReadKeyboard() A &= 0x5F CPI 0x44 JZ proc_0019 CPI 0x4E JZ biosWarmBoot JMP lbl_085C } data_086E: byte[] { 0x1B, 0x59, 0x34, 0x25, 0x65, 0x7D, 0x65, 0x20, 0x72, 0x61, 0x7A, 0x20, 0x28, 0x44, 0x2F, 0x4E, 0x29, 0x20, 0x3F, 0x00, 0x1F, 0x0A, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6D, 0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x6E, 0x67, 0x20, 0x20, 0x20, 0x20, 0x6F, 0x7E, 0x6B, 0x69, 0x0D, 0x0A, 0x00, 0xCA, 0x62, 0x03, 0x79, 0xBA, 0xCA, 0x0B, 0x03, 0x78, 0xA3, 0xBA, 0xC2, 0x36, 0x03, 0x3E, 0x23, 0x32, 0x5A, 0x03, 0xC3, 0x55, 0x03, 0xBB, 0xC2, 0x42, 0x03, 0x3E, 0x2B, 0x32, 0x5A, 0x03, 0xC3, 0x55, 0x03, 0xFE, 0x40, 0xC2, 0x4D, 0x03, 0x11, 0xB2, 0xFF, 0xC3, 0x50, 0x03, 0x11, 0x4E, 0x00, 0x3E, 0x19, 0x32, 0x5A, 0x03, 0x78, 0xE6, 0x3F, 0x47, 0x71, 0x23, 0x05, 0xC2, 0xE0, 0x01, 0xC3, 0x0B, 0x03, 0xC9, 0x00, 0x00, 0x00, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x2E, 0x14, 0x02, 0x20, 0x81, 0x03, 0x01, 0x05, 0x01, 0x10, 0x81, 0x02 }[свернуть]
M80 (07.02.2024), parallelno (25.01.2024)
Оживляем игровой фон:
С уважением, Станислав.
AlexBel (06.02.2024), Oleg N. Cher (30.01.2024), parallelno (29.01.2024), Pluto (06.02.2024), svofski (29.01.2024), Trol73 (29.01.2024), vernigor (31.01.2024)
Печатаем спрайт с маской:
С уважением, Станислав.
AlexBel (06.02.2024), ivagor (06.02.2024), Oleg N. Cher (05.02.2024), Pluto (06.02.2024), svofski (05.02.2024)
Коротенькая работа над ошибками. Спасибо ivagor'у!
Последний раз редактировалось CityAceE; 08.02.2024 в 09:23.
С уважением, Станислав.
parallelno (08.02.2024)
Еще раз присоединюсь к svofski, что это мелочи, на которые не стоит обращать много внимания, пока они не станут критичными. Лучше бы я пока помолчал, но теперь могу только учесть на будущее.
У меня еще вопрос, который возможно ты затрагивал в первых видео, которые я, признаюсь, подробно не смотрел. Почему не взял за основу какой-нибудь спековский игровой движок? Понятно, что современные движки сложные, зато их авторы теоретически могли помочь разобраться и упростить. Хотя конечно они (авторы движков) люди занятые и могли отказаться, тогда вопросов нет.
Вот как раз момент с OR/XOR (HL) не является мелочью, а является наглядным примером того, как можно одновременно сократить размер, сделать быстрее и понятнее код. Именно поэтому я решил снять короткий ролик. А другие ошибки типа опечаток я просто правлю тихонько за кадром. Но здесь был не тот случай! А я ещё как раз сидел и думал, как бы избавиться от PUSH/POP BC в этой процедуре. Нутром чуял, что можно, но в итоге так и забыл про (HL).
Нет, я этот вопрос не освещал. Основная причина, конечно, потому что я не игродел и у меня попросту таких знаний нет. У меня вообще изначально была идея просто показать как настроить среду и написать "Hello, World!" без процедур ПЗУ. Но когда увидел некоторый интерес со стороны зрителей, решил двинуться чуть дальше, а потом ещё и т.д.
Ну а что касается того, о чём я рассказываю, то я-то как раз по сути и описываю движок Sanchez'а! Как-то давно в разговоре он упомянул (когда это ещё не было широко известно), что для своих игр он вначале пишет прототип на C#, а графику в прототипе отрисовывает, записывая данные сразу в битмап. Мне это показалось очень интересным и я на Python сделал нечто вроде виртуального Спектрума со стандартной структурой Спектрумовского экрана, для которого можно писать на Python. А потом под это дело на Python решил сделать движок, чтобы потом перенести его на Спектрум, как это делал Sanchez. И так как у меня не было опыта создания спрайтовых игр, я начал одолевать Sanchez'а вопросами: "А как ты сделал то?", "А как ты реализовал это?". И Саша терпеливо на пальцах начал рассказывать мне как работает его движок, как он хранит карту, как анимирует тайлы, как выводит спрайты, как их сдвигает, а при необходимости ещё и разворачивает. Ко всему этому он шел постепенно, а мне просто выдал уже готовый результат. Например, когда-то ранее он мне рассказывал, как jerri на страницах этого форума подсказал ему крутую идею про вывод спрайта с маской по OR/XOR. Для меня это тогда вообще было тёмным лесом. Даже потом нашёл то сообщение на форуме, но всё равно ничего не понял. А вот когда я уже начал сам реализовывать печать спрайтов, то реально поразился красоте решения. Вот так по описаниям Sanchez'а я и написал по сути его движок на Python, обильно снабдив для себя комментариями. А сейчас я просто перекладываю его с Python на ассемблер, как и планировал ранее, только уже не для Спектрума и Z80, а для Специалиста и i8080. И, соответственно, сталкиваюсь с ограничениями в виде меньшего набора регистров у процессора, и отсутствия возможности синхронизировать вывод на экран. С последним у меня сейчас на Специалисте вообще проблема - анимированный спрайт героя сильно мерцает при восстановлении фона под ним. На Специалисте нужно делать дополнительный промежуточный буфер, что усложняет программу и понимание её работы. Я пока не реализовал это и вообще не уверен, что это легко позволит избавиться от мерцания. Хотя помочь, конечно, должно, потому что именно так сделано в Batty, в там на Специалисте уже ничего не мерцает. А вот на Спектруме нужно просто подгадать правильное по времени начало отрисовки без всяких лишних буферов и дополнительных процедур.
Последний раз редактировалось CityAceE; 08.02.2024 в 09:22.
С уважением, Станислав.
А чем она выгоднее метода AND/OR? При этом, во втором виде спрайты хранятся в прямом виде.
- - - Добавлено - - -
XOR используется в играх типа Lode Runner, чтобы повторным XOR по старым координатам восстановить оригинальную графику. Но если ты используешь маску, то ты явно портишь фон, отсюда и мой вопрос.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)