Rev 537 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
538 | lvd | 1 | ; Пример чтения фонтрома в пентеве ; ; (c) lvd^nedopc 2012 ; ; сорец для аласма START EQU #6000 ORG START DI LD A,1 OUT (#FE),A XOR A OUT (#BF),A LD BC,#EFF7 OUT (C),A ;ставим ефф7, который доступен только в нешедоу-режиме INC A OUT (#BF),A LD A,#07 LD BC,#FF77 OUT (C),A ;включаем новый пентевный текстмод - 1-страничный ; заодно ефф7 и фф77 ставят нам 7 МГц частоту CALL OUTPAGE ;выводим все символы на экран LOOP CALL SYNCREAD ;считываем фонтром методом чтения байтиков, которые на экране CALL DECODEFONT ; перекодируем в обычный формат фонтрома CALL INVERTFONT ; инвертируем все байты фонта CALL WRITEFONT ; пишем взад LD A,#7F IN A,(#FE) RRA JR C,LOOP ;итого всё мигает пока не нажмём any key LD A,#FF LD BC,#FFF7 OUT (C),A LD A,#03 LD C,#77 OUT (C),A ; восстанавливаем 6912-режим XOR A OUT (#BF),A ;закрываем шедоу RET OUTPAGE LD A,#7F-8 ;где находится 1страничный текстмод (см доку) LD BC,#FFF7 OUT (C),A LD HL,#C000 ; ставим атрибуты. Не обязательно, чтоб символы были видимы, LD DE,#C001 ; можно нафигачить нулей LD (HL),#05 LD BC,#3FFF LDIR XOR A ; код печатаемого символа LD HL,#C1C0 ; откуда начинаем печатать LD DE,64-40 LD C,25 ; сколько строк печатаем. Достаточно напечатать 16 строк сверху. STRLOOP LD B,80/5 SYMLOOP CALL PRINC ; повторяем каждый символ 5 раз CALL PRINC CALL PRINC CALL PRINC CALL PRINC INC A DJNZ SYMLOOP ADD HL,DE ; смещение на следующую строку DEC C JR NZ,STRLOOP RET PRINC ; печатаем символ и апдейтим указатель в HL на следующий символ LD (HL),A BIT 4,H SET 4,H RET Z RES 4,H INC HL RET SYNCREAD ; эта процедура должна выполняться при частоте процессора 7 МГц!!!!!!! ; сначала включаем IM 2 и делаем таблички для него DI IM 2 ; setup IM2 tables LD HL,INTTAB LD A,H LD I,A INC A LD (HL),A INC L JR NZ,$-2 INC H LD (HL),A LD L,H LD (HL),#C3 ; JP INC HL LD (HL),.INTPROC INC HL LD (HL),'INTPROC LD HL,FREAD ; заранее ставим куда будем читать фонт EI HALT EI HALT ; делаем халт чтоб после инта и задержки попасть чтением спецпорта прямо ; в момент начала отображения символов. делаем халт 2 раза, чтоб убедиццо, ; что инт будет схвачен в своем начале, а не в середине. ; обработчик инта - сначала JP, потом RET. ; делаем задержку до момента отображения первого символа. Он повторяется 5 раз, ; а первая команда INI попадает циклом ввода примерно в середину этих ; 5 символов LD BC,0 LD B,2 DJNZ $ LD D,76 LINWAIT LD BC,256*33 DJNZ $ DEC D JP NZ,LINWAIT LD BC,#0EBE ; заодно в процессе задержки грузим адрес порта LD D,128 ; и счётчик для 128 строк READLOOP ; читаем 16 байт. Как раз INI:INC B выполняется за 20 тактов, и 5 символов ; длятся тоже 20 тактов (@7MHz nowait) DUP 16 INI INC B EDUP LD E,7 ; просираем оставшееся время строки DEC E JR NZ,$-1 DEC D JP NZ,READLOOP ; итого весь этот луп занимает 448 тактов ; всё считали, идём на йух... DI IM 1 RET INTPROC ; обработчег инта :) RET DECODEFONT ; перекодируем считанный фонт в обычный формат LD HL,FREAD LD DE,FONT LD HX,16 DF256L LD LX,16 DF16L LD BC,16 DUP 8 LD A,(HL) ADD HL,BC LD (DE),A INC DE EDUP LD BC,1-128 ADD HL,BC DEC LX JR NZ,DF16L LD BC,128-16 ADD HL,BC DEC HX JR NZ,DF256L RET INVERTFONT ; инвертируем фонт LD HL,FONT LD BC,2048 IFLOOP LD A,(HL) CPL LD (HL),A CPI JP PE,IFLOOP RET WRITEFONT ; пишем фонт обратно в фонтром LD A,#05 OUT (#BF),A LD HL,FONT LD DE,FLDIR ; лдирим из озу в озу -- всё работает LD BC,2048 LDIR LD A,1 OUT (#BF),A RET ORG ($+255)&#FF00 INTTAB DS 512 FREAD DS 2048 FONT DS 2048 FLDIR EQU FONT & #F800 ENDD ORG START |