; device zxspectrum48 INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' ;======================================================================= collor_A EQU 0x03 collor_B EQU 0x02 collor_N EQU 0x04 collor_M EQU 0x08 collor_T EQU 0x07 org_addr EQU #5d3b ORG org_addr bstart: DW #100 ; line number = 1 DW l1end-l1begin ; line length l1begin: DB ZX_Token.randomize,ZX_Token.usr,"0" ; 'rand' 'usr' 0 DB ZX_Char.number DB #00,#00 : DW start : DB #00 ; start address DB ZX_Char.carriage_return l1end: DW #200 ; line number = 2 DW l2end-l2begin ; line length l2begin: DB ZX_Token.randomize,ZX_Token.usr,"0" ; ':' 'rand' 'usr' 0 DB ZX_Char.number DB #00,#00 : DW 15619 : DB #00 ; start address DB ":",ZX_Token.rem,":",ZX_Token.run,'"' filename: DB "boot ",'"',":" ; ':' 'rem' run ;======================================================================= ;org #5d65 start: LD (memSP),SP NewDisk: ;CALL clear_screen LD BC,#0905 LD DE,0 LD HL,catBuff CALL #3D13 LD A,"a" LD (main.markPos),A LD A,1 JP keys.setCP ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIGN #10 TXT_BUTTONS: .prev: DB '<<< PgUp' .next: DB 'PgDn >>>' ; main.CurrentPage: DB 1 main.PagesCounter: DB 1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; main: LD A,(.CurrentPage) LD (.PagesCounter),A .nextLoop: CALL PRINT_HELP LD A,collor_T LD (var_collor),A LD HL,#50CC LD (var_printPos),HL LD HL,catBuff + #08F5 LD B,8 .p1: LD A,(HL) PUSH HL CALL printChar POP HL INC L DJNZ .p1 ; LD A,L ; CP low (catBuff + #08FD) ; JR NZ,.p1 LD HL,#4000 LD (var_printPos),HL ; вычитывание каталога .buffPointer+1: LD HL,catBuff .markPos+2: LD BC,"aa" .l1: LD A,(HL) DEC A JR Z,.nextRec ; JP M,DirShowDone ; SET 3,L LD A,(HL) CP "B" RES 3,L JR NZ,.nextRec ; две спец кнопки LD A,C ; C - текущий файл CP "y" JR NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::" ; ; проходной прогон? LD A,(.PagesCounter) DEC A JR NZ,.nextHiddenRec ; basic file LD A,C CP B ; выбранный файл LD A,collor_A JR NZ,.notMarked ; выделение файла и копирование его в строку запуска XOR collor_M ; LD DE,filename PUSH BC LD BC,8 LDIR POP BC RES 3,L ; .notMarked: CALL prn_txt .nextHiddenRec: INC C .nextRec: LD DE,#10 ADD HL,DE JR .l1 ; PRINT_NEXT_BUTTONS: LD A,(main.PagesCounter) LD (keys.nxtPage),A DEC A ;JR Z,.noChange JR Z,keys LD (main.PagesCounter),A LD (main.buffPointer),HL .noChange: ;PUSH AF ;CALL PRINT_HELP ;POP AF ;JP Z,keys JR keys.toMain PRINT_HELP: LD HL,#5040 LD (var_printPos),HL LD A,collor_N PUSH BC LD C," " LD HL,TXT_BUTTONS.prev CALL prn_txt ; LD A,collor_N CALL prn_txt ; POP BC RET ; DirShowDone: XOR A LD (keys.nxtPage),A ;CALL PRINT_HELP keys: RES 5,(iy+1) .w1: BIT 5,(iy+1) JR Z,.w1 LD A,(iy-#32) ; CP B JR Z,exit CP #0D ; enter JR Z,exit CP " " ; space JP Z,NewDisk ; CP #04 ; pgUp LD E,-1 JR Z,.prevPage ; .pgdn: CP #05 ; pgDn LD E,1 JR Z,.nextPage ; .left: CP #08 ; left JR NZ,.sl DEC B JR .c1 ; .sl: CP #0B ; up JR NZ,.sd DEC B DEC B DEC B JR .c1 ; .sd: CP #0A ; down JR NZ,.su INC B INC B INC B JR .c1 ; .su: CP #09 ; right JR NZ,.sr INC B JR .c1 ; .sr: CP "a" JR C,keys CP C JR NC,keys LD B,A ; .c1: LD A,B CP "a" JR NC,.sf1 LD A,"a" .sf1: CP C JR C,.sf2 LD A,C DEC A .sf2: LD (main.markPos),A .toMain: JP main.nextLoop ; DE - +24 or -24 .nextPage: ; .nxtPage+1: LD A,0 AND A JR Z,.skip XOR A LD (.nxtPage),A ; ; DE - +24 or -24 .prevPage: LD A,(main.CurrentPage) ADD A,E JR Z,.skip ; .setCP: LD H,A LD L,A LD (main.CurrentPage),HL LD HL,catBuff LD (main.buffPointer),HL .skip: CALL clear_screen JR .toMain exit: LD A,C CP "a" JP Z,NewDisk memSP+1: LD SP,0 RET printChar: LD H,A ADD A,A ADD A,A ADD A,A LD L,A LD A,H RLCA RLCA RLCA AND 0x07 ADD A,0x3c LD H,A var_printPos+1: LD DE,0x4000 .l1: LD A,(HL) RRCA OR (HL) INC HL LD (DE),A INC D LD (DE),A INC D LD A,D AND 0x07 JR NZ,.l1 LD A,D SUB 0x08 LD D,A LD A,E ADD A,0x20 LD E,A AND 0x20 JR NZ,.l1 LD HL,(var_printPos) LD A,H RRCA RRCA RRCA ADD A,0x50 LD H,A var_collor+1: LD A,0 LD (HL),A SET 5,L XOR collor_A ^ collor_B LD (HL),A ; LD HL,var_printPos LD A,(HL) ADD A,0x21 AND 0xdf LD (HL),A RET NZ INC HL LD A,(HL) ADD A,0x08 LD (HL),A RET ; ; clear_screen: XOR A OUT (0xfe),A LD (ZX_VARS.ATTR_P),A LD (ZX_VARS.BORDER),A JP BASIC_FN.x48.cls ; A - current file ; choose_color: CP B ; выбранный файл. #C7 ; LD A,collor_A ; SCF ; RET NZ ; XOR collor_M ; RET ; A - COLOR ; C - char of text button ; HL - Text prn_txt: LD (var_collor),A LD A,C PUSH HL CALL printChar LD A," " CALL printChar POP HL ; .loop: LD A,(HL) INC HL PUSH HL CALL printChar POP HL LD A,L AND 0x07 JR NZ,.loop ; LD A,(var_printPos) AND 0x1f RET Z LD A," " PUSH HL CALL printChar POP HL RET ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ALIGN #10 ; TXT_BUTTONS: ; .prev: DB '<< PgDn ' ; .next: DB '>> PgUp ' ; ; ; main.CurrentPage: ; DB 1 ; main.PagesCounter: ; DB 1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; StartLineNum: DB 0 DW 0 ;DB #80 l2end: ;bend: DISPLAY "printChar ",/A,$-printChar DISPLAY "code ",/A,$-start ;ds -$&0x0f ;ALIGN #10 ;filename EQU $ catBuff EQU #6000 ;$ + (-$&0x0f) ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" EXPORT StartLineNum EXPORT org_addr ;