Важная информация

User Tag List

Страница 6 из 8 ПерваяПервая ... 2345678 ПоследняяПоследняя
Показано с 51 по 60 из 79

Тема: Специалист: программирование на ассемблере

  1. #51
    Moderator Аватар для fifan
    Регистрация
    30.05.2007
    Адрес
    г. Лянтор, Сургутского р-на, ХМАО
    Сообщений
    4,165
    Спасибо Благодарностей отдано 
    106
    Спасибо Благодарностей получено 
    125
    Поблагодарили
    71 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Hunta Посмотреть сообщение
    Язык ассемблера MACRO-11.
    Как-то не эстетично, это всё же не АВР или ПИК.

  2. #52
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Для 8080 примерно так можно делать с использованием PL/M 80, который скорее является надстройкой над ассемблером, чем ЯВУ.
    Ну тот же MASM в своё время был/есть очень популярным. Там в итоговой программе родных мнемоник иногда почти и нет. Макросы тема хорошая, но использовать их надо с умом и осторожно. Что касается псевдоязыка, который предложил Trol73, то та же IDA, например, в него "декодирует" дизассемблированный текст. Вполне себе повышает читабельность логики кода. Так что тоже достаточно разумная идея для кроссплатформы.

  3. #53
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    6,996
    Спасибо Благодарностей отдано 
    285
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fifan Посмотреть сообщение
    Как-то не эстетично
    Зато удобно, быстро и практично.
    По прикидкам, моя скорость написания программ выросла на порядок, а ещё, как оказалось - КРАЙНЕ ускоряет разборку в логике дизассемблированных программ - ну, правда, при условии, что код не был написан в стиле "крутое спагетти".
    Последний раз редактировалось Hunta; 25.01.2024 в 16:37.

  4. #54
    Activist Аватар для Trol73
    Регистрация
    07.05.2015
    Адрес
    г. Ульяновск
    Сообщений
    350
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    50
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сейчас пишу компилятор С-- - подобного языка для 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
    }
    [свернуть]

  5. Эти 2 пользователя(ей) поблагодарили Trol73 за это полезное сообщение:

    M80 (07.02.2024), parallelno (25.01.2024)

  6. #55
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Оживляем игровой фон:
    С уважением, Станислав.

  7. Эти 7 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    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)

  8. #56
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Печатаем спрайт с маской:

    С уважением, Станислав.

  9. Эти 5 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    AlexBel (06.02.2024), ivagor (06.02.2024), Oleg N. Cher (05.02.2024), Pluto (06.02.2024), svofski (05.02.2024)

  10. #57
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Коротенькая работа над ошибками. Спасибо ivagor'у!

    Последний раз редактировалось CityAceE; 08.02.2024 в 09:23.
    С уважением, Станислав.

  11. Этот пользователь поблагодарил CityAceE за это полезное сообщение:

    parallelno (08.02.2024)

  12. #58
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,842
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,814
    Поблагодарили
    1,043 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Еще раз присоединюсь к svofski, что это мелочи, на которые не стоит обращать много внимания, пока они не станут критичными. Лучше бы я пока помолчал, но теперь могу только учесть на будущее.
    У меня еще вопрос, который возможно ты затрагивал в первых видео, которые я, признаюсь, подробно не смотрел. Почему не взял за основу какой-нибудь спековский игровой движок? Понятно, что современные движки сложные, зато их авторы теоретически могли помочь разобраться и упростить. Хотя конечно они (авторы движков) люди занятые и могли отказаться, тогда вопросов нет.

  13. #59
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Еще раз присоединюсь к svofski, что это мелочи, на которые не стоит обращать много внимания, пока они не станут критичными. Лучше бы я пока помолчал, но теперь могу только учесть на будущее.
    Вот как раз момент с OR/XOR (HL) не является мелочью, а является наглядным примером того, как можно одновременно сократить размер, сделать быстрее и понятнее код. Именно поэтому я решил снять короткий ролик. А другие ошибки типа опечаток я просто правлю тихонько за кадром. Но здесь был не тот случай! А я ещё как раз сидел и думал, как бы избавиться от PUSH/POP BC в этой процедуре. Нутром чуял, что можно, но в итоге так и забыл про (HL).

    Цитата Сообщение от ivagor Посмотреть сообщение
    У меня еще вопрос, который возможно ты затрагивал в первых видео, которые я, признаюсь, подробно не смотрел. Почему не взял за основу какой-нибудь спековский игровой движок? Понятно, что современные движки сложные, зато их авторы теоретически могли помочь разобраться и упростить. Хотя конечно они (авторы движков) люди занятые и могли отказаться, тогда вопросов нет.
    Нет, я этот вопрос не освещал. Основная причина, конечно, потому что я не игродел и у меня попросту таких знаний нет. У меня вообще изначально была идея просто показать как настроить среду и написать "Hello, World!" без процедур ПЗУ. Но когда увидел некоторый интерес со стороны зрителей, решил двинуться чуть дальше, а потом ещё и т.д.

    Ну а что касается того, о чём я рассказываю, то я-то как раз по сути и описываю движок Sanchez'а! Как-то давно в разговоре он упомянул (когда это ещё не было широко известно), что для своих игр он вначале пишет прототип на C#, а графику в прототипе отрисовывает, записывая данные сразу в битмап. Мне это показалось очень интересным и я на Python сделал нечто вроде виртуального Спектрума со стандартной структурой Спектрумовского экрана, для которого можно писать на Python. А потом под это дело на Python решил сделать движок, чтобы потом перенести его на Спектрум, как это делал Sanchez. И так как у меня не было опыта создания спрайтовых игр, я начал одолевать Sanchez'а вопросами: "А как ты сделал то?", "А как ты реализовал это?". И Саша терпеливо на пальцах начал рассказывать мне как работает его движок, как он хранит карту, как анимирует тайлы, как выводит спрайты, как их сдвигает, а при необходимости ещё и разворачивает. Ко всему этому он шел постепенно, а мне просто выдал уже готовый результат. Например, когда-то ранее он мне рассказывал, как jerri на страницах этого форума подсказал ему крутую идею про вывод спрайта с маской по OR/XOR. Для меня это тогда вообще было тёмным лесом. Даже потом нашёл то сообщение на форуме, но всё равно ничего не понял. А вот когда я уже начал сам реализовывать печать спрайтов, то реально поразился красоте решения. Вот так по описаниям Sanchez'а я и написал по сути его движок на Python, обильно снабдив для себя комментариями. А сейчас я просто перекладываю его с Python на ассемблер, как и планировал ранее, только уже не для Спектрума и Z80, а для Специалиста и i8080. И, соответственно, сталкиваюсь с ограничениями в виде меньшего набора регистров у процессора, и отсутствия возможности синхронизировать вывод на экран. С последним у меня сейчас на Специалисте вообще проблема - анимированный спрайт героя сильно мерцает при восстановлении фона под ним. На Специалисте нужно делать дополнительный промежуточный буфер, что усложняет программу и понимание её работы. Я пока не реализовал это и вообще не уверен, что это легко позволит избавиться от мерцания. Хотя помочь, конечно, должно, потому что именно так сделано в Batty, в там на Специалисте уже ничего не мерцает. А вот на Спектруме нужно просто подгадать правильное по времени начало отрисовки без всяких лишних буферов и дополнительных процедур.
    Последний раз редактировалось CityAceE; 08.02.2024 в 09:22.
    С уважением, Станислав.

  14. #60
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    ...jerri на страницах этого форума подсказал ему крутую идею про вывод спрайта с маской по OR/XOR.
    А чем она выгоднее метода AND/OR? При этом, во втором виде спрайты хранятся в прямом виде.

    - - - Добавлено - - -

    XOR используется в играх типа Lode Runner, чтобы повторным XOR по старым координатам восстановить оригинальную графику. Но если ты используешь маску, то ты явно портишь фон, отсюда и мой вопрос.

Страница 6 из 8 ПерваяПервая ... 2345678 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Программирование на ассемблере
    от shuran33 в разделе Вектор
    Ответов: 311
    Последнее: 23.02.2024, 17:00
  2. Ответов: 22
    Последнее: 12.02.2023, 16:13
  3. Программирование на ассемблере
    от tnt23 в разделе Океан-240
    Ответов: 3
    Последнее: 24.01.2019, 00:12
  4. Ответов: 275
    Последнее: 16.12.2018, 23:01
  5. Продам книгу- AMIGA: программирование на ассемблере
    от Doctor Max в разделе Барахолка (архив)
    Ответов: 11
    Последнее: 01.03.2012, 00:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •