DEVICE ZXSPECTRUM128 ;device pentagon1024 include "../_sdk/syssets.asm" ifdef USETOPDOWNMEM TOPDOWNMEM=1 else TOPDOWNMEM=0;1 endif if atm != 2 memport0000=0x37f7 memport4000=0x77f7 memport8000=0xb7f7 memportc000=0xf7f7 memportrom0000=0x3ff7 memportrom4000=0x7ff7 memportrom8000=0xbff7 memportromc000=0xfff7 pagexor=0xff else memport0000=0x3ff7 memport4000=0x7ff7 memport8000=0xbff7 memportc000=0xfff7 memportrom0000=0x3ff7 memportrom4000=0x7ff7 memportrom8000=0xbff7 memportromc000=0xfff7 pagexor=0x7f endif if NEMOIDE==1 ;схема Nemo: hddstat=0xF0 hddcmd=0xF0 hddhead=0xD0 hddcylhi=0xB0 hddcyllo=0x90 hddsec=0x70 hddcount=0x50 hdderr=0x30 hdddatlo=0x10 hdddathi=0x11 hddupr=0xC8 hdduprON=0 else ;схема ATM: hddstat=0xFEEF hddcmd=0xFEEF hddhead=0xFECF hddcylhi=0xFEAF hddcyllo=0xFE8F hddsec=0xFE6F hddcount=0xFE4F hdderr=0xFE2F hdddatlo=0xFE0F hdddathi=0xFF0F hddupr=0xFEBE ;при установленном b7 FFBA hdduprON=0xFFBA hddupr1=0xF7 hddupr0=0x77 endif memport8000_hi=memport8000/256 memportc000_hi=memportc000/256 SYSMINSTACK=0x3b00 resident=0x6000;0x6000+8000 (где не затрут при очистке экрана) ;pgtrdosfs trdos_catbuf=0x6300;0x3200 ;,0x900 ;pgtrdosfs (0x4000) trdos_sectorbuf=0x6c00 trdos_fcbbuf=0x6d00 ;size=0x200*trdos_MAXFILES trdos_MAXFILES=8 INTMUZSTACK=0x3e00 ;kernelspace ;INTSTACK1=0x3f00 ;kernelspace (для входа в обработчик без порчи стека) (не пересекается с возможным стеком задачи!!!) INTSTACK2=0x5f00;0x6000 ;pgkillable и pgtrdosfs (рабочий стек обработчика прерываний) (>=0x4000, иначе нельзя выключить теневые порты) TRDOSSTACK=0x5f00-96;0x6000-96 ;чтобы не пересекалось с INTSTACK (в промежутке между преключениями страниц может произойти системное прерывание), но и на экран не попало BDOSSTACK=0x4000 ;kernelspace STACK=0x4000 ;userspace ;при вызове BDOS стек некоторое время такой же, как в юзерспейсе ;поэтому на входе в BDOS надо иметь в 0x4000...0xffff страницы, которые не жалко ;предполагается, что юзер не имеет стек ниже 0x3b00, иначе он затрёт систему include "../_sdk/sys_h.asm" if TOPDOWNMEM pgtrdosfs=pagexor-(sys_npages-1) pgfatfs=pagexor-(sys_npages-2) pgsys=pagexor-(sys_npages-3) pgfatfs2=pagexor-(sys_npages-4) ;structs else pgtrdosfs=pagexor-8 pgfatfs=pagexor-9 pgsys=pagexor-10 pgfatfs2=pagexor-11 ;structs endif pgkillable=pagexor-4 ;в 128K памяти, т.к. можно портить ;pgfirstfree=pagexor-11 pgscr0_0=pagexor-1 pgscr0_1=pagexor-5 pgscr1_0=pagexor-3 pgscr1_1=pagexor-7 fd_system=0x57;%01010111 ;%0x01sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000 fd_system_getchar=0x56;%01010110 ;%0x01sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000 fd_user=0x47;%01000111 ;%0x00sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000 ;условные страницы для sjasm COMPILEPG_INIT=0 COMPILEPG_SYS0=4 COMPILEPG_SYS1=6 SLOT 1 page COMPILEPG_INIT org 0x6000 begin di xor a out (0xfe),a ifdef KOE display "KOE!!!" ld a,0 ;turbo ;0x10 ;noturbo ld bc,0xeff7 out (c),a ;for KOE ld a,0x10 ld bc,0x7ffd out (c),a endif if atm==2 ld hl,basvar.tape ld de,0x5c00 ld bc,basvar.endtape - basvar.tape ldir ld sp,0x5800 ld a,(0x3CBC) cp 0x83 call z,0x3C9E ;call 0x3d21 endif if atm==3 ld a,32 ;xor a ;D5=444 palette out (0xbf),a endif LD (IY+1),0xCC if 1==0 LD A,(23833) ADD A,'A' LD (src),A LD (dst),A XOR A LD (23658),A ;0x5c6a ;LD L,A,H,L ;LD (23802),HL endif XOR A ld (0x5d10),a call reset_ay ;ld hl,0xc9f1 ;pop af:ret ;ld (0x5cc2),hl ;ld bc,0xfbdf ;x ;in l,(c) ;ld b,0xff ;in h,(c) ;ld (init_oldmousecoords),hl ;;;;;;;;;;;;;;;;;;; set gfx mode ;;;;;;;;;;;;;;;;; ei halt ;LD A,0xaa;%10101010 ;640x200 mode ;LD A,0xae;%10101110 ;textmode if atm==1 init_rst_buf=0x4000 ;проверим версию ers ld d,0x00 rst 0x08 defb 0x4d,0x00 ld hl,-0x5812 ;ERS_MIN_VERSION 0.58.12 add hl,de ld a,0xff jr nc,.err_version ;выясним откуда запустились ld hl,init_rst_buf rst 0x08 defb 0x50,0x03 rst 0x08 ; в D вернется текущий драйв defb 0x50,0x02 ld a,d add a,a add a,a add a,a ld hl,init_rst_buf ld b,0 ld c,a add hl,bc ld de,init_rst_buf+512 ld bc,8 ldir ld a,(init_rst_buf+512) rst 0x08 defb 0x50,0x05 ld a,(init_rst_buf+512) and 1 ;m/s ld hl,init_rst_buf ld bc,0x0000 ld d,b ld e,c ld a,2 ex af,af' ;' ld a,1 rst 0x08 defb 0x50,0x04,0x02 ld a,(init_rst_buf+512) ld d,12 cp 0x0f jr z,.l3 ld d,3 cp 4 jr z,.init_sysdev_part ld d,7 cp 5 jp nz,init_sysdev_end .init_sysdev_part ld hl,init_rst_buf+0x01BE+0x0008-12 .l2 inc d push de ld bc,12 add hl,bc ld bc,0x0400 ld de,init_rst_buf+512+3 .l1 ld a,(de) xor (hl) or c ld c,a inc de inc hl djnz .l1 pop de or a jr nz,.l2 .l3 ld a,d .err_version ld (init_sysdrv_val),a init_sysdev_end halt ld bc,0xeff7 ld a,0x80 out (c),a ld a,0x10 ld bc,0x7ffd out (c),a ld bc,0x01bf out (c),b LD A,0xa8;%10101000 ;320x200 mode ld bc,0xbd77 ;shadow ports and palette remain on out (c),a ld a,32 ;xor a ;D5=444 palette out (0xbf),a else LD A,0xa8;%10101000 ;320x200 mode CALL INIT_OUTSHADON endif call INIT_blackpal di if atm==1 and PS2KBD ld bc,0xdef7 out (c),c ld b,0xbe ld a,2 out (c),a endif if atm==3 or atm==1 ld a,0x7f-5 ld bc,memportrom4000 out (c),a ;отключаем 7ffd ld a,0x7f-2 ld bc,memportrom8000 out (c),a ;отключаем 7ffd ;ld a,0x7f-2 ld bc,memportromc000 out (c),a ;отключаем 7ffd endif if atm != 1 call findpgdos else ld a,0x04 in a,(0xbd) and 0xbf;%10111111 ;ld a,0x8b endif ld lx,a ld (sys_pgdos),a ;до установки резидента ld a,pgsys call INIT_setpg_c000 ld hl,0x8000 ld de,0xc000 ld bc,0x4000 ldir ld a,pgtrdosfs call INIT_setpg_c000 ld hl,wastrdosfs ld de,0xc000+idle;COMMANDLINE;PROGSTART ;idle code ld bc,trdosfs_sz ldir ld a,(init_sysdrv_val) ;нужно для проверки версии ERS ld (0xc000+idle+6),a ;при неправильном ERS сисдир==0xff ld a,0xc3 ld (0x5cc2),a ld hl,ONERR;ddrv ld (0x5cc3),hl ld hl,0x5c00 ld de,0xc000+0x1c00 ld bc,0x0400;for run hobeta;0x0200;0x5d3b-0x5c00 ldir ld hl,wasresident ld de,resident+0xc000-0x4000 ld bc,resident_sz ldir ld hl,0x5c4b ld de,varbas_stor+0x8000 ld bc,32 ldir ld hl,0xc000+trdos_fcbbuf-0x4000 ld d,h ld e,l inc de ld bc,0x200*trdos_MAXFILES-1 ld (hl),l;0 ldir ;ld a,pgidle ;call INIT_setpg_c000 ;ld hl,wasidle ;ld de,0x0100+0xc000 ;ld bc,idle_sz ;ldir ld a,pgsys call INIT_setpg_8000 ld a,pgfatfs call INIT_setpg_c000 ;jr $ ;перебрасываем 16K упакованный блок в 0xb000 ld hl,wassys+0x4fff ld de,0xffff ld bc,0x5000 lddr ;распаковываем в 0x6400 ld hl,0xb000;wassys ld de,0x6400;0x8000 call DEC40 ;распаковываем в de (там уже включены системные странички) ;перебрасываем 32K из 0x6400 в 0x8000 ld hl,0x6400+0x7fff ld de,0x8000+0x7fff ld bc,0x8000 lddr fatfspatchaddr=0xc000 ld hl,devices_init ld (0xc000+FFS_DRV.init),hl ld hl,disk_status ld (0xc000+FFS_DRV.status),hl ld hl,devices_read ;read to userspace ld (0xc000+FFS_DRV.rd_to_usp),hl ld hl,devices_readnopg ;read to buffer ld (0xc000+FFS_DRV.rd_to_buf),hl ld hl,devices_write ;write from userspace ld (0xc000+FFS_DRV.wr_fr_usp),hl ld hl,devices_writenopg ;write from buffer ld (0xc000+FFS_DRV.wr_fr_buf),hl ld hl,get_fattime ld (0xc000+FFS_DRV.RTC),hl ld hl,strcpy_lib2usp ld (0xc000+FFS_DRV.strcpy_lib2usp),hl ld hl,strcpy_usp2lib ld (0xc000+FFS_DRV.strcpy_usp2lib),hl ld hl,memcpy_lib2usp ld (0xc000+FFS_DRV.memcpy_lib2usp),hl ld hl,memcpy_usp2lib ld (0xc000+FFS_DRV.memcpy_usp2lib),hl ld hl,memcpy_buf2usp ld (0xc000+FFS_DRV.memcpy_buf2usp),hl ld hl,memcpy_usp2buf ld (0xc000+FFS_DRV.memcpy_usp2buf),hl ;инициализация менеджера памяти и вход в юзерспейс: ;HALT (чтобы прерывание не произошло когда не надо) ;[назначаем страницы системспейса (одна из них должна быть такая же, как в юзерспейсе) - уже есть общая страница 5] ;в юзерспейсе назначаем нижнюю страницу с керналем (вместо ПЗУ) ld a,fd_user out (0xfd),a if atm==3 or atm==1 ld a,0x7f ld bc,memportrom0000 out (c),a ;отключаем ПЗУ ld a,0x7f-5 ld bc,memportrom4000 out (c),a ;отключаем 7ffd ld a,0x7f-2 ld bc,memportrom8000 out (c),a ;отключаем 7ffd ;ld a,0x7f-2 ld bc,memportromc000 out (c),a ;отключаем 7ffd endif ld a,pgtrdosfs ;idle ld bc,memport0000 out (c),a ;ld hl,wasuserkernel+0x8000 ;ld de,0 ;ld bc,userkernel_sz ;ldir ld a,fd_system out (0xfd),a if atm==3 or atm==1 ld a,0x7f ld bc,memportrom0000 out (c),a ;отключаем ПЗУ ;4000,8000,c000 уже отключили 7ffd выше endif ld a,pgsys ld bc,memport0000 out (c),a ;в системспейсе: ;включить fatfs ;поставить резидент в 7fxx ;переходим в sys_intq, а оттуда в init_resident if 1==0 ld a,lx;(sys_pgdos) ld bc,memportrom0000 out (c),a LD A,0xa8;%10101000 ;320x200 mode ld bc,0xff77 ;shadow ports off, palette off out (c),a ld a,1 ld c,1 call 0x3d13 ld c,0x18 call 0x3d13 ld hl,0xc000 ld de,0x0000 ld bc,0x0805 call 0x3d13 jr $ endif ld sp,BDOSSTACK ;ei ;halt ;чтобы прерывание не произошло когда не надо ;di ;jr $ ;init_oldmousecoords=$+1 ; ld hl,0 ; ld (sys_oldmousecoords),hl call BDOS_setpgstructs ld hl,0xc000 ld de,0xc001 ld bc,0x3fff ld (hl),l;0 ldir ;не помогло init_sysdrv_val=$+1 ld a,SYSDRV ld (SYSDRV_VAL),a jp setkernelpages_go ;di!!! reset_ay ld a,0xfe call reset_ay_ay ld a,0xff reset_ay_ay ld bc,#fffd out (c),a xor a ld l,a reset_ay_ay0 ld b,#ff out (c),a ld b,#bf out (c),l inc a cp 14 jr nz,reset_ay_ay0 ret if atm != 1 INIT_OUTSHADON ;LD BC,0xFF77 ;shadow ports remain off LD BC,0xBD77 ;shadow ports and palette remain on LD IX,10835 PUSH IX JP 0x3D2F endif INIT_setpg_low LD BC,memportrom0000 ;page for 0x0000..0x3fff OUT (C),A ret INIT_setpg_8000 LD BC,memport8000 ;page for 0x8000..0xbfff OUT (C),A ret INIT_setpg_c000 LD BC,memportc000 ;page for 0xc000..0xffff OUT (C),A ret if atm==2 basvar .tape defb 0xFF, 0x00, 0x00, 0x00, 0x0D, 0x05, 0x10, 0x0D, 0x0D, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 defb 0x01, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x00, 0x00, 0x00 defb 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFD, 0x7F, 0x3E, 0x14, 0xED, 0x79, 0xC3, 0x00, 0xC0 defb 0x18, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x00, 0xFF, 0xCC, 0x01, 0xFC, 0x5F, 0x00 defb 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x02, 0x07, 0x00, 0x00, 0xB4, 0x5D, 0x00, 0x00, 0x26 defb 0x5D, 0x26, 0x5D, 0x3B, 0x5D, 0xB4, 0x5D, 0x3A, 0x5D, 0xB5, 0x5D, 0xB5, 0x5D, 0xB3, 0x5D, 0x00 defb 0x00, 0xB7, 0x5D, 0xC3, 0x5D, 0xC3, 0x5D, 0x2D, 0x92, 0x5C, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00 defb 0x00, 0x00, 0x00, 0x00, 0xB6, 0x1A, 0x92, 0x00, 0x24, 0x01, 0x00, 0x58, 0xFF, 0x00, 0x00, 0x21 defb 0x00, 0x5B, 0x21, 0x17, 0x00, 0x40, 0xE0, 0x50, 0x21, 0x18, 0x21, 0x17, 0x01, 0x07, 0x00, 0x07 defb 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 defb 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 defb 0x00, 0x00, 0xFF, 0x5F, 0xFF, 0xFF, 0xF4, 0x09, 0xA8, 0x10, 0x4B, 0xF4, 0x09, 0xC4, 0x15, 0x53 defb 0x81, 0x0F, 0xC9, 0x49, 0x91, 0xF4, 0x09, 0xC4, 0x83, 0x83, 0x83, 0x83, 0x00, 0x00, 0x00, 0x35 defb 0x36, 0x31, 0x36, 0x0E, 0x00, 0x00, 0x03, 0x6B, 0x5E, 0x95, 0x5E, 0x00, 0x25, 0x73, 0x74, 0x73 defb 0x35, 0x2E, 0x31, 0x61, 0x20, 0x43, 0x00, 0xDB, 0x00, 0x25, 0x25, 0x03, 0x09, 0x00, 0x00, 0x00 defb 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x80, 0x08 defb 0x00, 0xC8, 0xFA, 0x5C, 0xFA, 0x5C, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00 defb 0xFF, 0x89, 0x5D, 0xFC, 0x5F, 0xFF, 0x3C, 0xAA, 0x00, 0x00, 0x01, 0x02, 0xFA, 0x5F, 0x03, 0x00 defb 0xFE, 0x0D, 0x80, 0x00, 0x00, 0xFF, 0xF4, 0x09, 0xA8, 0x10, 0x4B, 0xF4, 0x09, 0xC4, 0x15, 0x53 defb 0x81, 0x0F, 0xC4, 0x15, 0x52, 0xF4, 0x09, 0xC4, 0x15, 0x50, 0x80, 0x01, 0x00, 0x23, 0x00, 0xFD defb 0xB0, 0x22, 0x36, 0x35, 0x33, 0x36, 0x38, 0x22, 0x3A, 0xF9, 0xC0, 0xB0, 0x22, 0x31, 0x35, 0x36 defb 0x31, 0x39, 0x22, 0x3A, 0xEA, 0x3A, 0xF7, 0x22, 0x62, 0x6F, 0x6F, 0x74, 0x20, 0x20, 0x20, 0x20 defb 0x22, 0x0D, 0x80, 0xF4, 0x5C, 0x01, 0x05, 0x2E, 0x21, 0x00, 0x60, 0xE5, 0xC3, 0x13, 0x3D, 0x0D .endtape endif if atm != 1 findpgdos ;если не найти страницу текущего доса, то на старых версиях ПЗУ ZX Evo не будет работать (в странице 0x83 почему-то не дос по умолчанию) call crcdos ld (doscrchi),de ld (doscrclo),bc ld lx,0x83 findpgdos0 ld a,lx call INIT_setpg_low call crcdos doscrchi=$+1 ld hl,0 or a sbc hl,de jr nz,doscrcbad doscrclo=$+1 ld hl,0 or a sbc hl,bc jr nz,doscrcbad ld a,lx ret doscrcbad ld a,lx add a,4 ld lx,a cp 0xc0 jr c,findpgdos0 ld a,0x83 ;not found ret crcdos ld hl,0x0000 ld bc,0 ld de,0 crcdos0 ld a,d add a,a rl c rl b rl e rl d xor b ld b,a ld a,(hl) xor c ld c,a inc hl bit 6,h jr z,crcdos0 ret endif INIT_blackpal LD HL,blackpalend ;halt ;halt есть выше - убрано, чтобы не светилось ничего LD DE,0xa80f ;0xab=6912 ;palette on, EGA, turbo LD BC,0xBD77 OUT (C),D INIT_setpal0 LD A,E and 7 BIT 3,E OUT (0xFE),A JR Z,$+4 OUT (0xF6),A LD A,(HL) DEC HL ld b,(hl) ;DDp palette low bits dec hl ld c,0xff OUT (c),a;(0xFF),A DEC E JP P,INIT_setpal0 ret ifdef NOPAL dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c else ds 32,0xf3 endif blackpalend=$-1 include "unmegalz.asm" ;DEC40 wasresident disp resident if atm != 1 readmouse ;=$-wasresident+resident ;sp=0x7fxx ;e=gfxmode ;out: ;a=gfxmode, hl=mousecoords, d=mousebuttons, e=kempstonbuttons call sys_SHADOFF ;ifdef NOMOUSE ; ld hl,0 ; ld d,0x0f ;buttons ;else ld bc,0xfadf ;buttons in d,(c) inc b ;ld bc,0xfbdf ;x in l,(c) ld b,0xff ;y in h,(c) ld c,0x1f in e,(c) ;kempstonbuttons inc e jr nz,$+3 ;0xff = kempston joystick absent inc e ;will be 0 after dec dec e jr shadon_pgsys_a ;endif endif shadon_pgsys ;=$-wasresident+resident LD A,e;0xa8;%10101000 ;320x200 mode shadon_pgsys_a ;=$-wasresident+resident if atm != 1 CALL sys_SHADON else ld bc,0x01bf out (c),b ld bc,0xbd77 ;shadow ports and palette remain on out (c),a ld a,32 ;xor a ;D5=444 palette out (0xbf),a endif if atm==3 or atm==1 ld a,0x7f call sys_setpg_low ld a,pgsys ld bc,memport0000 jr sys_outca_jr else ld a,0x7f-(pagexor-pgsys) endif sys_setpg_low ;=$-wasresident+resident ld bc,memportrom0000 jr sys_outca_jr sys_SHADOFF ;=$-wasresident+resident sys_pgdos=wasresident+(($+1)-resident) ;для патча ld a,0x83 ;48 basic switchable to DOS call sys_setpg_low LD A,e;0xa8;%10101000 ;320x200 mode ld bc,0xff77 ;shadow ports off, palette off sys_outca_jr out (c),a ret if atm != 1 sys_SHADON ;=$-wasresident+resident LD bc,10835 PUSH bc LD BC,0xBD77 ;shadow ports and palette remain on JP 0x3D2F endif ;TODO убрать в pgtrdos dos3d13_resident ;=$-wasresident+resident ;сейчас включена pg5 ;iy=23610 ld (dos3d13_sp_st),sp ld sp,trdos_sp ;надо стек в 0x4000+ (не пересекающийся с INTSTACK, т.к. сейчас может произойти системное прерывание), по умолчанию стек был в 0x3fxx ;call swap_sysvars ex af,af' ;' call sys_SHADOFF ;включили ПЗУ ld (em3d13_de_st),de ;push de ;e=gfxmode ;***************************** ;call EM3D13PP;0x3d13 ;собственно дpайвеp, аналогичный 0x3д13 (и с его использованием) ;на выходе - A pавно 0 - все окей, не 0 - ошибка ;вместо пpоцедyp DRAW_WINDOWS, PRINT_WINDOWS и REST_WINDOW ;использyй свои. ;Kurleson ;EM3D13PP ld hl,em3d13pp_ret push hl ld (23613),sp xor a ld (23801),a ld (23823),a ld (23824),a ld hl,varbas_stor ld de,0x5c4b ld bc,32 ldir if atm == 1 ld a,32 ;xor a ;D5=444 palette out (0xbf),a endif exx ;pop hl,de,bc ex af,af' ;' jp 0x3D13 ONERR ex (sp),hl push af ld a,(0x5d0f) or a jr nz,em3d13pp_ret ld a,h cp 0x0d jr z,em3d13_error ONERR_NO pop af ex (sp),hl ret em3d13_error ld a,0xff ld (0x5d0f),a em3d13pp_ret em3d13_de_st=$+1 ld de,0 ;e=gfxmode di call shadon_pgsys ;выключили ПЗУ (неатомарно - две записи в порт!!!) ei ;call swap_sysvars dos3d13_sp_st=$+1 ;-wasresident+resident ld sp,0 ld a,(0x5d0f) ;возврат ошибки ret if atm != 1 if atm2clock != 1 ; Подержка часов GLUK в АТМ2+ (актуальная процедура для Evo находится в syskrnl) NVRAM_REG=0xdf NVRAM_VAL=0xbf bin2cmos ;a to cmos cell b (BCD) push af ld a,b ld bc,0xf7 + (NVRAM_REG<<8) out (c),a pop af ld b,-1 inc b sub 10 jr nc,$-3 add a,10 ;a=num mod 10 ;b=num div 10 sla b sla b sla b ;b=(num div 10) *8 add a,b add a,b ld b,NVRAM_VAL out (c),a ;BCD ret minmes ;=$-wasresident+resident ld h,a xor a srl h rra srl h rra srl h rra ret bcd2bin ;=$-wasresident+resident ld bc,0xf7 + (NVRAM_REG<<8) out (c),a ld b,NVRAM_VAL in a,(c) ld b,a and 0xf0 rra ;*8 ld c,a ;*8 rra ;*4 rra ;*2 add a,c ;*10 res 7,b res 6,b res 5,b res 4,b add a,b ret readtime ;=$-wasresident+resident ;sp=0x7fxx ;e=gfxmode ;out: hl=date, de=time ;TODO атомарно call sys_SHADOFF LD A,e;0xa8;%10101000 ;320x200 mode push af ld bc,0xeff7 ld a,0x80 out (c),a ;ld bc,0xf7 + (NVRAM_REG<<8) ;ld a,0x0b ;out (c),a ;ld b,NVRAM_VAL ;in a,(c) ;or 0x04 ;out (c),a xor a ;sec call bcd2bin srl a ld e,a ld a,2 ;min call bcd2bin call minmes ;a0 >> 3 => ha add a,e ld e,a ld d,h ld a,4 ;h call bcd2bin add a,a add a,a add a,a add a,d ld d,a ld a,7 ;day call bcd2bin ld l,a ld a,8 ;month call bcd2bin call minmes ;a0 >> 3 => ha add a,l ld l,a ld a,9 ;year call bcd2bin add a,20 add a,a add a,h ld h,a jp readtimeq writetime ;bc=time ;hl=date push bc call sys_SHADOFF LD A,e;0xa8;%10101000 ;320x200 mode pop de push af ld bc,0xeff7 ld a,0x80 out (c),a ld a,e add a,a and 63 ld b,0 ;sec call bin2cmos ld a,d rra rra rra and 31 ;h ld b,4 call bin2cmos ex de,hl add hl,hl add hl,hl add hl,hl ex de,hl ld a,d and 63 ;m ld b,2 call bin2cmos ld a,h srl a sub 20 ld b,9 ;year call bin2cmos ld a,l and 31 ld b,7 ;day call bin2cmos add hl,hl add hl,hl add hl,hl ld a,h and 15 ld b,8 ;month call bin2cmos readtimeq ld bc,0xeff7 xor a out (c),a pop af ld e,a ;!!! потом будет использоваться в readtime jp shadon_pgsys else ;if atm2clock == 1 ; Подержка часов 8952 АТМ2+ и АТМ8 cmd2ve: ;e=command возвращаем результат в A di ld bc,0x55FE ;адрес 8952 in a,(c) ;Переход в режим команды ld b,e ;команда из E переноcим в B in a,(c) ;выполнить команду ei ret send2ve: ;e=command b=data push de ld e,b ld d,a di ld bc,0x55FE ;адрес 8952 in a,(c) ;Переход в режим команды ld b,e ;команда из E переноcим в B IN a,(c) ld b,d ;Параметр in a,(c) ei pop de ret writetime ;bc=time ;hl=date ;TODO (keep de!) push bc call sys_SHADOFF LD A,e;0xa8;%10101000 ;320x200 mode pop de push af ld bc,0xeff7 ld a,0x80 out (c),a ld a,e add a,a and 63 ld b,0x11 ;sec call send2ve ld a,d rra rra rra and 31 ;h ld b,0x91 call send2ve ex de,hl add hl,hl add hl,hl add hl,hl ex de,hl ld a,d and 63 ;m ld b,0x51 call send2ve ld a,h srl a ;sub 20 ld b,0x93 ;year call send2ve ld a,l and 31 ld b,0x13 ;day call send2ve add hl,hl add hl,hl add hl,hl ld a,h and 15 ld b,0x53 ;month call send2ve ld bc,0xeff7 xor a out (c),a pop af ld e,a ;!!! потом будет использоваться в readtime jp shadon_pgsys readtime ;=$-wasresident+resident ;sp=0x7fxx ;e=gfxmode ;out: hl=date, de=time ;TODO атомарно call sys_SHADOFF LD A,e;0xa8;%10101000 ;320x200 mode push af push bc ld e, 0x90 ;hours call cmd2ve ld l, a ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ld e, 0x50 ;Minutes call cmd2ve add a,l ld l,a ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ld e, 0x10 ;Seconds call cmd2ve srl a add a,l ld l,a push hl ;save time ; Date ld e, 0x92 ;year call cmd2ve ;add a, 20 ld l, a ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ld e, 0x52 ;month call cmd2ve add a,l ld l,a ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ld e, 0x12 ;day call cmd2ve add a,l ld l,a pop de pop bc pop af jp shadon_pgsys_a endif ;if atm2clock != 1 endif ;if atm != 1 ;disp $-wasresident+resident ds 100 trdos_sp varbas_stor ds 32 ent resident_sz=$-wasresident display "residentend=",resident+resident_sz,"<=",trdos_catbuf wastrdosfs disp COMMANDLINE;PROGSTART idle db "idle",0 ds PROGSTART-$ include "idle.asm" idle_sz=$-idle ent disp 0x4000+idle+idle_sz include "trdosfs.asm" include "trdosio.asm" include "bdospg2.asm" ent trdosfs_sz=$-wastrdosfs display "trdosfs_sz=",/h,trdosfs_sz,"<=0x1c00" end wassys SLOT 0 page COMPILEPG_SYS0 SLOT 1 page COMPILEPG_SYS1 org 0x0000 sysbegin include "syskrnl.asm" display "$ before align=",syskrnl_end if 1 macro SETHANDLER cmd,addr org wastbdoscmds+cmd db addr&0xff org wastbdoscmds+256+cmd db addr/256 endm ds 0xff&(-syskrnl_end) tbdoscmds=syskrnl_end+(0xff&(-syskrnl_end)) wastbdoscmds ds 256,BDOS_fail&0xff ds 256,BDOS_fail/256 SETHANDLER CMD_GETPAGEOWNER,BDOS_getpageowner SETHANDLER CMD_WRITEHANDLE,BDOS_writehandle SETHANDLER CMD_WIZNETREAD,BDOS_wiznetread SETHANDLER CMD_YIELDKEEP,BDOS_yieldkeep SETHANDLER CMD_YIELD,BDOS_yield SETHANDLER CMD_READHANDLE,BDOS_readhandle SETHANDLER CMD_GETKEYMATRIX,BDOS_getkeymatrix SETHANDLER CMD_GETTIMER,BDOS_gettimer SETHANDLER CMD_CHECKPID,BDOS_checkpid SETHANDLER CMD_SETSCREEN,BDOS_setscreen SETHANDLER CMD_PRATTR,BDOS_prattr SETHANDLER CMD_SETXY,BDOS_setxy SETHANDLER CMD_SETCOLOR,BDOS_setcolor SETHANDLER CMD_PRCHAR,BDOS_prchar SETHANDLER CMD_GETATTR,BDOS_getattr SETHANDLER CMD_SETDTA,BDOS_setdta;0x1a SETHANDLER CMD_FOPEN,BDOS_fopen;0x0f SETHANDLER CMD_FREAD,BDOS_fread;0x14 SETHANDLER CMD_FCLOSE,BDOS_fclose;0x10 SETHANDLER CMD_FDEL,BDOS_fdel;0x13 ;DEPRECATED!!!!! SETHANDLER CMD_FCREATE,BDOS_fcreate;0x16 SETHANDLER CMD_FWRITE,BDOS_fwrite;0x15 SETHANDLER CMD_FSEARCHFIRST,BDOS_fsearchfirst;0x11 SETHANDLER CMD_FSEARCHNEXT,BDOS_fsearchnext;0x12 SETHANDLER CMD_OPENDIR,BDOS_opendir SETHANDLER CMD_READDIR,BDOS_readdir SETHANDLER CMD_SETDRV,BDOS_setdrv SETHANDLER CMD_PARSEFNAME,BDOS_parse_filename;0x5c SETHANDLER CMD_CHDIR,BDOS_chdir SETHANDLER CMD_GETPATH,BDOS_getpath SETHANDLER CMD_RUNAPP,BDOS_runapp SETHANDLER CMD_NEWAPP,BDOS_newapp SETHANDLER CMD_CLS,BDOS_cls SETHANDLER CMD_SETGFX,BDOS_setgfx SETHANDLER CMD_SETPAL,BDOS_setpal SETHANDLER CMD_GETMAINPAGES,BDOS_getmainpages SETHANDLER CMD_NEWPAGE,BDOS_newpage SETHANDLER CMD_DELPAGE,BDOS_delpage SETHANDLER CMD_MOUNT,BDOS_mount SETHANDLER CMD_FREEZEAPP,BDOS_freezeapp SETHANDLER CMD_MKDIR,BDOS_mkdir SETHANDLER CMD_RENAME,BDOS_rename SETHANDLER CMD_SETSYSDRV,BDOS_setsysdrv ;SETHANDLER CMD_FWRITE_NBYTES,BDOS_fwrite_nbytes SETHANDLER CMD_SCROLLUP,BDOS_scrollup SETHANDLER CMD_SCROLLDOWN,BDOS_scrolldown SETHANDLER CMD_OPENHANDLE,BDOS_openhandle SETHANDLER CMD_CREATEHANDLE,BDOS_createhandle SETHANDLER CMD_CLOSEHANDLE,BDOS_closehandle SETHANDLER CMD_SEEKHANDLE,BDOS_seekhandle SETHANDLER CMD_TELLHANDLE,BDOS_tellhandle SETHANDLER CMD_SETFILETIME,BDOS_setfiletime SETHANDLER CMD_GETFILETIME,BDOS_getfiletime SETHANDLER CMD_GETTIME,BDOS_gettime SETHANDLER CMD_GETXY,BDOS_getxy SETHANDLER CMD_GETAPPMAINPAGES,BDOS_getappmainpages SETHANDLER CMD_DROPAPP,BDOS_dropapp SETHANDLER CMD_WIZNETOPEN,BDOS_wiznetopen SETHANDLER CMD_WIZNETCLOSE,BDOS_wiznetclose SETHANDLER CMD_WIZNETWRITE,BDOS_wiznetwrite SETHANDLER CMD_GETFILESIZE,BDOS_getfilesize SETHANDLER CMD_DELETE,BDOS_delete SETHANDLER CMD_GETCHILDRESULT,BDOS_getchildresult SETHANDLER CMD_SETWAITING,BDOS_setwaiting SETHANDLER CMD_SETBORDER,BDOS_setborder SETHANDLER CMD_READSECTORS,BDOS_readsectors SETHANDLER CMD_WRITESECTORS,BDOS_writesectors SETHANDLER CMD_SETMAINPAGE,BDOS_setmainpage SETHANDLER CMD_SETMUSIC,BDOS_setmusic SETHANDLER CMD_PLAYCOVOX,BDOS_playcovox SETHANDLER CMD_GETSTDINOUT,BDOS_getstdinout SETHANDLER CMD_SETSTDINOUT,BDOS_setstdinout SETHANDLER CMD_HIDEFROMPARENT,BDOS_hidefromparent SETHANDLER CMD_RNDRD,BDOS_rndrd SETHANDLER CMD_RNDWR,BDOS_rndwr SETHANDLER CMD_GETFILINFO,BDOS_getfilinfo SETHANDLER CMD_RESERV_1,BDOS_reserv_1 SETHANDLER CMD_GETCONFIG,BDOS_get_config SETHANDLER CMD_GETMEMPORTS,BDOS_getmemports SETHANDLER CMD_SETTIME,BDOS_settime SETHANDLER CMD_GETPAL,BDOS_getpal org wastbdoscmds+512 trecode=tbdoscmds+512 else tbdoscmds=syskrnl_end wastbdoscmds db CMD_WRITEHANDLE db CMD_WIZNETREAD db CMD_YIELDKEEP db CMD_YIELD db CMD_READHANDLE db CMD_GETKEYMATRIX db CMD_GETTIMER db CMD_CHECKPID db CMD_SETSCREEN db CMD_PRATTR db CMD_SETXY db CMD_SETCOLOR db CMD_PRCHAR db CMD_GETATTR db CMD_SETDTA;0x1a db CMD_FOPEN;0x0f db CMD_FREAD;0x14 db CMD_FCLOSE;0x10 db CMD_FDEL;0x13 ;DEPRECATED!!!!! db CMD_FCREATE;0x16 db CMD_FWRITE;0x15 db CMD_FSEARCHFIRST;0x11 db CMD_FSEARCHNEXT;0x12 db CMD_OPENDIR db CMD_READDIR db CMD_SETDRV db CMD_PARSEFNAME;0x5c db CMD_CHDIR db CMD_GETPATH db CMD_RUNAPP db CMD_NEWAPP db CMD_CLS db CMD_SETGFX db CMD_SETPAL db CMD_GETMAINPAGES db CMD_NEWPAGE db CMD_DELPAGE db CMD_MOUNT db CMD_FREEZEAPP db CMD_MKDIR db CMD_RENAME db CMD_SETSYSDRV ;db CMD_FWRITE_NBYTES db CMD_SCROLLUP db CMD_SCROLLDOWN db CMD_OPENHANDLE db CMD_CREATEHANDLE db CMD_CLOSEHANDLE db CMD_SEEKHANDLE db CMD_TELLHANDLE db CMD_SETFILETIME db CMD_GETFILETIME db CMD_GETTIME db CMD_GETXY db CMD_GETAPPMAINPAGES db CMD_DROPAPP db CMD_WIZNETOPEN db CMD_WIZNETCLOSE db CMD_WIZNETWRITE db CMD_GETFILESIZE db CMD_DELETE db CMD_GETCHILDRESULT db CMD_SETWAITING db CMD_SETBORDER db CMD_READSECTORS db CMD_WRITESECTORS db CMD_SETMAINPAGE db CMD_SETMUSIC db CMD_PLAYCOVOX db CMD_GETSTDINOUT db CMD_SETSTDINOUT db CMD_HIDEFROMPARENT db CMD_RNDRD db CMD_RNDWR db CMD_GETFILINFO db CMD_RESERV_1 db CMD_GETCONFIG db CMD_GETMEMPORTS db CMD_SETTIME db CMD_GETPAL nbdoscmds=$-wastbdoscmds dw BDOS_getpal dw BDOS_settime dw BDOS_getmemports dw BDOS_get_config dw BDOS_reserv_1 dw BDOS_getfilinfo dw BDOS_rndwr dw BDOS_rndrd dw BDOS_hidefromparent dw BDOS_setstdinout dw BDOS_getstdinout dw BDOS_playcovox dw BDOS_setmusic dw BDOS_setmainpage dw BDOS_writesectors dw BDOS_readsectors dw BDOS_setborder dw BDOS_setwaiting dw BDOS_getchildresult dw BDOS_delete dw BDOS_getfilesize dw BDOS_wiznetwrite dw BDOS_wiznetclose dw BDOS_wiznetopen dw BDOS_dropapp dw BDOS_getappmainpages dw BDOS_getxy dw BDOS_gettime dw BDOS_getfiletime dw BDOS_setfiletime dw BDOS_tellhandle dw BDOS_seekhandle dw BDOS_closehandle dw BDOS_createhandle dw BDOS_openhandle dw BDOS_scrolldown dw BDOS_scrollup ;dw BDOS_fwrite_nbytes dw BDOS_setsysdrv dw BDOS_rename dw BDOS_mkdir dw BDOS_freezeapp dw BDOS_mount dw BDOS_delpage dw BDOS_newpage dw BDOS_getmainpages dw BDOS_setpal dw BDOS_setgfx dw BDOS_cls dw BDOS_newapp dw BDOS_runapp dw BDOS_getpath dw BDOS_chdir dw BDOS_parse_filename dw BDOS_setdrv dw BDOS_readdir dw BDOS_opendir dw BDOS_fsearchnext dw BDOS_fsearchfirst dw BDOS_fwrite dw BDOS_fcreate dw BDOS_fdel ;DEPRECATED!!!!! dw BDOS_fclose dw BDOS_fread dw BDOS_fopen dw BDOS_setdta dw BDOS_getattr dw BDOS_prchar dw BDOS_setcolor dw BDOS_setxy dw BDOS_prattr dw BDOS_setscreen dw BDOS_checkpid dw BDOS_gettimer dw BDOS_getkeymatrix dw BDOS_readhandle dw BDOS_yield dw BDOS_yieldkeep dw BDOS_wiznetread dw BDOS_writehandle trecode=tbdoscmds+$-wastbdoscmds endif ;TODO хранить прямо в текстовом экране? а если затрут, то восстанавливать? по какому событию? incbin "../_sdk/codepage/866toatm" syscodesz=trecode+256-wassyscode display "syscodesz=",/h,syscodesz," < minstack=",/h,SYSMINSTACK wasuserkernel disp 0x0000 include "userkrnl.asm" ent userkernel_sz=$-wasuserkernel ;display "wasuserkernel=",/d,wasuserkernel ;display "wasuserkernel_end=",/d,$ ;display "userkernel_sz=",/d,userkernel_sz ;wastjump ; include "tjump.asm" ;tjump_sz=$-wastjump ds 0x4000-$ incbin "../fatfs4os/fatfs.raw" sysend ;display "begin=",/d,begin ;display "end=",/d,end ;display "sysbegin=",/d,sysbegin ;display "sysend=",/d,sysend SLOT 1 page COMPILEPG_INIT savebin "initcode.c",begin,end-begin SLOT 0 page COMPILEPG_SYS0 SLOT 1 page COMPILEPG_SYS1 savebin "syscode.c",sysbegin,sysend-sysbegin LABELSLIST "..\..\us\user.l",1