Rev 736 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 548 | savelij | 1 | |
| 2 | ; Пример чтения фонтрома в пентеве |
||
| 3 | ; |
||
| 4 | ; (c) lvd^nedopc 2012 |
||
| 5 | ; |
||
| 6 | ; сорец для аласма |
||
| 7 | |||
| 646 | savelij | 8 | ;ПЕРЕДЕЛКА ДЛЯ КОМПИЛЯЦИИ В СОСТАВЕ EVO RESET SERVICE 16.04.2012 savelij |
| 548 | savelij | 9 | |
| 831 | savelij | 10 | ;LAST UPDATE: 30.06.2019 savelij |
| 11 | |||
| 548 | savelij | 12 | ;START EQU #6000 |
| 13 | ; ORG START |
||
| 14 | |||
| 646 | savelij | 15 | FREAD EQU CPU1+OFFSET_SCRSAVE;OFFSET_FNTSAVE;-0X800 |
| 16 | FONT EQU CPU1+OFFSET_FNTSAVE;0XD800 |
||
| 548 | savelij | 17 | ;FLDIR EQU 0XD800 |
| 18 | |||
| 19 | SCAN_FONT |
||
| 20 | ; DI |
||
| 21 | |||
| 22 | ; LD A,1 |
||
| 23 | ; OUT (0XFE),A |
||
| 24 | |||
| 549 | savelij | 25 | ; XOR A |
| 26 | ; OUT (PEVO_CONF),A |
||
| 548 | savelij | 27 | |
| 549 | savelij | 28 | ; LD BC,0XEFF7 |
| 29 | ; OUT (C),A ;ставим ефф7, который доступен только в нешедоу-режиме |
||
| 548 | savelij | 30 | |
| 549 | savelij | 31 | ; INC A |
| 32 | ; OUT (PEVO_CONF),A |
||
| 548 | savelij | 33 | |
| 34 | LD A,0XA7 |
||
| 35 | LD BC,0XFF77 |
||
| 36 | OUT (C),A ;включаем новый пентевный текстмод - 1-страничный |
||
| 37 | ; заодно ефф7 и фф77 ставят нам 7 МГц частоту |
||
| 736 | savelij | 38 | EVOPORT WIN_P1,RAM_SCR_FONT |
| 548 | savelij | 39 | CALL OUTPAGE ;выводим все символы на экран |
| 40 | |||
| 41 | LOOP |
||
| 42 | CALL SYNCREAD ;считываем фонтром методом чтения байтиков, которые на экране |
||
| 43 | JP DECODEFONT ; перекодируем в обычный формат фонтрома ИИНВЕРТИМ СЧИТАННЫЙ ФОНТ |
||
| 44 | ; CALL INVERTFONT ; инвертируем все байты фонта |
||
| 45 | ; CALL WRITEFONT ; пишем взад |
||
| 46 | |||
| 47 | ; LD A,0X7F |
||
| 48 | ; IN A,(0XFE) |
||
| 49 | ; RRA |
||
| 50 | ; JR C,LOOP ;итого всё мигает пока не нажмём any key |
||
| 51 | |||
| 52 | ; LD A,0XFF |
||
| 53 | ; LD BC,WIN_A3 |
||
| 54 | ; OUT (C),A |
||
| 55 | |||
| 56 | ; LD A,0XA3 |
||
| 57 | ; LD BC,0XFF77 |
||
| 58 | ; OUT (C),A ; восстанавливаем 6912-режим |
||
| 59 | |||
| 60 | ; XOR A |
||
| 61 | ; OUT (PEVO_CONF),A ;закрываем шедоу |
||
| 62 | |||
| 63 | ; RET |
||
| 64 | |||
| 65 | OUTPAGE |
||
| 66 | ; LD A,0X7F-8 ;где находится 1страничный текстмод (см доку) |
||
| 67 | ; LD BC,WIN_A3 |
||
| 68 | ; OUT (C),A |
||
| 69 | |||
| 70 | ; LD HL,0XC000 ; ставим атрибуты. Не обязательно, чтоб символы были видимы, |
||
| 71 | ; LD DE,0XC001 ; можно нафигачить нулей |
||
| 72 | ; LD (HL),0X01;5 |
||
| 73 | ; LD BC,0X3FFF |
||
| 74 | ; LDIR |
||
| 75 | |||
| 573 | savelij | 76 | XOR A |
| 77 | LD HL,CPU3+LATTR |
||
| 831 | savelij | 78 | ROMCALL CLSTXTMD1,ROM_RST82 |
| 573 | savelij | 79 | XOR A |
| 80 | LD HL,CPU3+RATTR |
||
| 831 | savelij | 81 | ROMCALL CLSTXTMD1,ROM_RST82 |
| 548 | savelij | 82 | |
| 83 | XOR A ; код печатаемого символа |
||
| 573 | savelij | 84 | LD HL,CPU3+LSYM ;0XC1C0 ; откуда начинаем печатать |
| 548 | savelij | 85 | LD DE,64-40 |
| 86 | LD C,25 ; сколько строк печатаем. Достаточно напечатать 16 строк сверху. |
||
| 87 | STRLOOP |
||
| 88 | LD B,80/5 |
||
| 89 | SYMLOOP |
||
| 90 | CALL PRINC ; повторяем каждый символ 5 раз |
||
| 91 | CALL PRINC |
||
| 92 | CALL PRINC |
||
| 93 | CALL PRINC |
||
| 94 | CALL PRINC |
||
| 95 | |||
| 96 | INC A |
||
| 97 | |||
| 98 | DJNZ SYMLOOP |
||
| 99 | |||
| 100 | ADD HL,DE ; смещение на следующую строку |
||
| 101 | |||
| 102 | DEC C |
||
| 103 | JR NZ,STRLOOP |
||
| 104 | |||
| 105 | RET |
||
| 106 | |||
| 107 | PRINC ; печатаем символ и апдейтим указатель в HL на следующий символ |
||
| 108 | LD (HL),A |
||
| 109 | BIT 4,H |
||
| 110 | SET 4,H |
||
| 111 | RET Z |
||
| 112 | RES 4,H |
||
| 113 | INC HL |
||
| 114 | RET |
||
| 115 | |||
| 116 | SYNCREAD |
||
| 117 | |||
| 118 | ; эта процедура должна выполняться при частоте процессора 7 МГц!!!!!!! |
||
| 119 | |||
| 120 | ; сначала включаем IM 2 и делаем таблички для него |
||
| 121 | DI |
||
| 122 | ; IM 2 |
||
| 123 | |||
| 124 | ; setup IM2 tables |
||
| 125 | |||
| 126 | ; LD HL,INTTAB |
||
| 127 | ; LD A,1 |
||
| 128 | ; LD I,A |
||
| 129 | ; INC A |
||
| 130 | |||
| 131 | ; LD (HL),A |
||
| 132 | ; INC L |
||
| 133 | ; JR NZ,$-2 |
||
| 134 | |||
| 135 | ; INC H |
||
| 136 | ; LD (HL),A |
||
| 137 | |||
| 138 | ; LD L,H |
||
| 139 | ; LD (HL),0XC3 ; JP |
||
| 140 | ; INC HL |
||
| 141 | ; LD (HL)LOW (INTPROC) |
||
| 142 | ; INC HL |
||
| 143 | ; LD (HL),HIGH (INTPROC) |
||
| 144 | |||
| 145 | |||
| 585 | savelij | 146 | LD HL,EI_RET |
| 147 | LD (ADR_INT),HL |
||
| 148 | |||
| 548 | savelij | 149 | LD HL,FREAD ; заранее ставим куда будем читать фонт |
| 150 | |||
| 151 | EI |
||
| 152 | HALT |
||
| 153 | EI |
||
| 154 | HALT ; делаем халт чтоб после инта и задержки попасть чтением спецпорта прямо |
||
| 155 | ; в момент начала отображения символов. делаем халт 2 раза, чтоб убедиццо, |
||
| 156 | ; что инт будет схвачен в своем начале, а не в середине. |
||
| 157 | ; обработчик инта - сначала JP, потом RET. |
||
| 158 | |||
| 159 | |||
| 160 | |||
| 161 | |||
| 162 | ; делаем задержку до момента отображения первого символа. Он повторяется 5 раз, |
||
| 163 | ; а первая команда INI попадает циклом ввода примерно в середину этих |
||
| 164 | ; 5 символов |
||
| 623 | savelij | 165 | LD BC,0 ;10 |
| 585 | savelij | 166 | DI ;4 |
| 167 | LD B,2 ;7 |
||
| 623 | savelij | 168 | DJNZ $ ;13*2+8 |
| 548 | savelij | 169 | LD D,76 |
| 170 | LINWAIT |
||
| 171 | LD BC,256*33 |
||
| 172 | DJNZ $ |
||
| 173 | DEC D |
||
| 174 | JP NZ,LINWAIT |
||
| 175 | LD BC,0X0EBE ; заодно в процессе задержки грузим адрес порта |
||
| 176 | LD D,128 ; и счётчик для 128 строк |
||
| 177 | |||
| 178 | |||
| 179 | READLOOP |
||
| 180 | ; читаем 16 байт. Как раз INI:INC B выполняется за 20 тактов, и 5 символов |
||
| 181 | ; длятся тоже 20 тактов (@7MHz nowait) |
||
| 182 | REPT 16 |
||
| 183 | INI |
||
| 184 | INC B |
||
| 185 | ENDM |
||
| 186 | |||
| 187 | LD E,7 ; просираем оставшееся время строки |
||
| 188 | DEC E |
||
| 189 | JR NZ,$-1 |
||
| 190 | |||
| 191 | DEC D |
||
| 192 | JP NZ,READLOOP ; итого весь этот луп занимает 448 тактов |
||
| 193 | |||
| 194 | |||
| 195 | ; всё считали, идём на йух... |
||
| 196 | DI |
||
| 197 | ; IM 1 |
||
| 198 | RET |
||
| 199 | |||
| 585 | savelij | 200 | ;INTPROC ; обработчег инта :) |
| 201 | ; RET |
||
| 548 | savelij | 202 | |
| 203 | |||
| 204 | |||
| 205 | |||
| 206 | DECODEFONT |
||
| 207 | |||
| 208 | ; перекодируем считанный фонт в обычный формат |
||
| 209 | |||
| 210 | LD HL,FREAD |
||
| 211 | LD DE,FONT |
||
| 212 | |||
| 213 | |||
| 214 | LD IXH,16 |
||
| 215 | DF256L |
||
| 216 | LD IXL,16 |
||
| 217 | DF16L |
||
| 218 | LD BC,16 |
||
| 219 | REPT 8 |
||
| 220 | LD A,(HL) |
||
| 221 | ADD HL,BC |
||
| 222 | LD (DE),A |
||
| 223 | INC DE |
||
| 224 | ENDM |
||
| 225 | |||
| 226 | LD BC,1-128 |
||
| 227 | ADD HL,BC |
||
| 228 | |||
| 229 | DEC IXL |
||
| 230 | JR NZ,DF16L |
||
| 231 | |||
| 232 | LD BC,128-16 |
||
| 233 | ADD HL,BC |
||
| 234 | |||
| 235 | DEC IXH |
||
| 236 | JR NZ,DF256L |
||
| 237 | |||
| 238 | RET |
||
| 239 | |||
| 240 | |||
| 241 | |||
| 242 | ;INVERTFONT |
||
| 243 | |||
| 244 | ; инвертируем фонт |
||
| 245 | |||
| 246 | ; LD HL,FONT |
||
| 247 | ; LD BC,2048 |
||
| 248 | ;IFLOOP |
||
| 249 | ; LD A,(HL) |
||
| 250 | ; CPL |
||
| 251 | ; LD (HL),A |
||
| 252 | ; CPI |
||
| 253 | ; JP PE,IFLOOP |
||
| 254 | |||
| 255 | ; RET |
||
| 256 | |||
| 257 | |||
| 258 | |||
| 259 | ;WRITEFONT |
||
| 260 | |||
| 261 | ; пишем фонт обратно в фонтром |
||
| 262 | |||
| 263 | ; LD A,0X05 |
||
| 264 | ; OUT (PEVO_CONF),A |
||
| 265 | |||
| 266 | ; LD HL,FONT |
||
| 267 | ; LD DE,FLDIR ; лдирим из озу в озу -- всё работает |
||
| 268 | ; LD BC,2048 |
||
| 269 | ; LDIR |
||
| 270 | |||
| 271 | ; LD A,1 |
||
| 272 | ; OUT (PEVO_CONF),A |
||
| 273 | ; RET |
||
| 274 | |||
| 275 | |||
| 276 | |||
| 277 | ; ORG ($+255)&0XFF00 |
||
| 278 | ;INTTAB |
||
| 279 | ; DS 512 |
||
| 280 | |||
| 281 | |||
| 282 | ;FREAD DS 2048 |
||
| 283 | ;FONT DS 2048 |
||
| 284 | |||
| 285 | ;FLDIR EQU FONT & 0XF800 |
||
| 286 | |||
| 287 | ;ENDD |
||
| 288 | ; ORG START |