?login_element?

Subversion Repositories NedoOS

Rev

Rev 555 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. EGA=1
  5. bmpbuf=0xbf00
  6. egagfx=0x6000 ;converted gfx (256 tiles *32 bytes vertically) = 0x2000
  7.  
  8. muz=0xc000
  9. muzplay=muz+3
  10.  
  11. INTSTACK=0x3f00
  12.  
  13.         org PROGSTART
  14. begin
  15.         ld sp,0x4000
  16.         OS_HIDEFROMPARENT
  17.  
  18.         if EGA
  19.         ld e,0 ;EGA
  20.         else
  21.         ld e,3 ;6912
  22.         endif
  23.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  24.  
  25.         if EGA
  26.         ld e,0
  27.         OS_CLS
  28.  
  29.         ;jr $
  30.         ;ld de,dirname
  31.         ;OS_CHDIR
  32.         ld de,gfxname
  33.         call openstream_file
  34.         ;or a
  35.         ;jp nz,noloadgfx
  36.         ld de,bmpbuf
  37.         ld hl,14+2
  38. ;DE = Buffer address, HL = Number of bytes to read
  39.         call readstream_file
  40.         ld de,bmpbuf
  41.         ld hl,(bmpbuf+14)
  42.         dec hl
  43.         dec hl
  44. ;DE = Buffer address, HL = Number of bytes to read
  45.         call readstream_file
  46.         ld de,bmpbuf
  47.         ld hl,16384+(4*16);16504 ;8bit bmp 128x128
  48. ;DE = Buffer address, HL = Number of bytes to read
  49.         call readstream_file
  50.         call closestream_file
  51.  
  52.         call recodepal
  53.         ld de,pal
  54.         OS_SETPAL
  55.        
  56.         ld hl,bmpbuf+(128*127)+(4*16);+0x76 ;bottom
  57.         ld e,0
  58. recodegfx0
  59.         push hl
  60.         ld lx,16
  61. recodegfx0bmpline
  62.         ld d,egagfx/256
  63.         call recodegfxsubchr
  64.         inc hl
  65.         inc hl
  66.         call recodegfxsubchr
  67.         inc hl
  68.         inc hl
  69.         call recodegfxsubchr
  70.         inc hl
  71.         inc hl
  72.         call recodegfxsubchr
  73.         inc hl        
  74.         inc hl
  75.         inc e
  76.         dec lx
  77.         jr nz,recodegfx0bmpline
  78.         pop hl
  79.         ld bc,-(128*8)
  80.         add hl,bc
  81.        
  82.         inc e
  83.         dec e
  84.         jr nz,recodegfx0
  85.        
  86.         endif
  87.  
  88.  
  89.         OS_GETMAINPAGES
  90. ;dehl=номера страниц в 0000,4000,8000,c000
  91.         ld a,l
  92.         LD (pgmuznum),A
  93.         ld hl,wasmuz
  94.         ld de,muz
  95.         ld bc,muzsz
  96.         ldir
  97.  
  98.         ;OS_GETSCREENPAGES
  99.         ;if EGA
  100.         ;ld a,e
  101.         ;SETPG32KLOW
  102.         ;ld a,d
  103.         ;ld (pgc000),a
  104.         ;SETPG32KHIGH
  105.         ;else ;6912
  106.         ;ld a,d
  107.         ;SETPG16K
  108.         ;endif
  109.         ;call setpgs_scr
  110.  
  111.          ld a,(pgmuznum)
  112.         SETPG32KHIGH
  113.          ;ld a,(pgmuznum)
  114.          ld hl,muzplay
  115.          OS_SETMUSIC
  116.  
  117.         call swapimer
  118.  
  119.         include "eric1.asm"
  120.  
  121. ;oldtimer
  122. ;        dw 0
  123. quiter
  124.         halt
  125.         ld a,(pgmuznum)
  126.         SETPG32KHIGH
  127.         ;ld a,(pgmuznum)
  128.           ld hl,muz
  129.           OS_SETMUSIC
  130.         ;call muz ;shutay
  131.         halt
  132.         call swapimer
  133.         QUIT ;rasmer
  134.  
  135.  
  136. swapimer
  137.         di
  138.          ld hl,(0x0038+3) ;адрес intjp
  139.          ld (intjpaddr),hl        
  140.         ld de,0x0038
  141.         ld hl,oldimer
  142.         ld bc,3
  143. swapimer0
  144.         ld a,(de)
  145.         ldi ;[oldimer] -> [0x0038]
  146.         dec hl
  147.         ld (hl),a ;[0x0038] -> [oldimer]
  148.         inc hl
  149.         jp pe,swapimer0
  150.         ei
  151.         ret
  152. oldimer
  153.         jp on_int ;заменится на код из 0x0038
  154.  
  155. on_int
  156. ;restore stack with de
  157.         ld (on_int_hl),hl
  158.         ld (on_int_sp),sp
  159.         pop hl
  160.         ld (on_int_sp2),sp
  161. intjpaddr=$+1
  162.         ld (0),hl ;ok ;(on_int_jp),hl
  163.        
  164.         ld sp,INTSTACK
  165.        
  166.         push af
  167.         push bc
  168.         push de
  169.        
  170. ;imer_curscreen_value=$+1
  171.          ;ld a,0
  172.          ;ld bc,0x7ffd
  173.          ;out (c),a
  174.  
  175.         ex de,hl;ld hl,0
  176. on_int_sp=$+1
  177.         ld (0),hl ;ok ;восстановили запоротый стек
  178.        
  179.         push ix
  180.         push iy
  181.         ex af,af'
  182.        exx
  183.        push af
  184.        push bc
  185.        push de
  186.        push hl
  187.        ;ld a,(curscreen)
  188.        ;ld e,a
  189.        ;OS_SETSCREEN ;вызываем здесь, а не в рандомном месте, иначе даже с одной задачей можем получить непредсказуемую задержку, которую не фиксирует наш таймер? с несколькими задачами надо учитывать и системный - TODO
  190. ;curpalette=$+1
  191.        ;ld de,wolfpal
  192.        ;OS_SETPAL
  193.        GET_KEY
  194.        ld (curkey),a
  195.  
  196.        ld a,(CURPG32KHIGH) ;ok
  197.        push af
  198. pgmuznum=$+1
  199.        ld a,0
  200.        SETPG32KHIGH
  201.        ;call muzplay
  202. ;pgc000=$+1
  203.        pop af
  204.        SETPG32KHIGH
  205.        
  206.        pop hl
  207.        pop de
  208.        pop bc
  209.        pop af
  210.        exx
  211.        ex af,af'
  212.         pop iy
  213.         pop ix
  214.        
  215.         ;ld hl,(timer)
  216.         ;inc hl
  217.         ;ld (timer),hl
  218.  
  219.         pop de
  220.         pop bc
  221.         pop af
  222.        
  223. on_int_hl=$+1
  224.         ld hl,0
  225. on_int_sp2=$+1
  226.         ld sp,0
  227. ;        ei
  228. ;on_int_jp=$+1
  229. ;       jp 0
  230.  
  231.         push de
  232.         ex de,hl
  233. ;(intjp)=адрес выхода
  234. ;de="hl", в стеке "de"
  235.         jp 0x0038+5
  236.  
  237. ;вход в стандартный обработчик:
  238.         ;ex de,hl ;de="hl", hl="de"
  239.         ;ex (sp),hl ;hl=адрес выхода, de="hl", в стеке "de"
  240.         ;ld (intjp),hl ;TODO писать не прямо в intjp, а в промежуточную локацию (иначе хвост обработчика нельзя с ei - он сам не может сменить режим обработки прерывания после jp)
  241. ;(intjp)=адрес выхода
  242. ;de="hl", в стеке "de"
  243.         ;ld l,a
  244. ;user_fdvalue6=$+1
  245.         ;ld a,fd_system
  246.         ;out (0xfd),a ;10 b
  247.  
  248.  
  249.         if EGA
  250.        
  251.         macro RECODEBYTE
  252.         ld a,(hl)
  253.         ld ($+4),a
  254.         ld a,(trecodebyteleft)
  255.         ld b,a
  256.         inc hl
  257.         ld a,(hl)
  258.         dec hl
  259.         ld ($+4),a
  260.         ld a,(trecodebyteright)
  261.         or b
  262.         endm
  263.        
  264. recodegfxsubchr
  265. ;из hl в de
  266. ;de растёт по +256 (сохраняем положение в конце)
  267. ;hl растёт по -128 (возвращаем в конце как было)
  268.         push bc
  269.         push hl
  270.         ld c,128
  271.         dup 7
  272.         RECODEBYTE
  273.         ld b,0xff
  274.         ld (de),a
  275.         inc d
  276.         add hl,bc
  277.         edup
  278.         RECODEBYTE        
  279.         ld (de),a
  280.         inc d
  281.         pop hl
  282.         pop bc
  283.         ret
  284.  
  285. recodepal
  286.         ld hl,bmpbuf;+54
  287.         ld ix,pal
  288.         ld b,16
  289. recodepal0
  290.         ld e,(hl)
  291.         inc hl
  292.         ld d,(hl)
  293.         inc hl
  294.         push hl
  295.         ld l,(hl) ;e=B, d=G, l=R
  296.         call readfile_rgbtopal
  297.         pop hl
  298.         inc hl
  299.         inc hl
  300.         djnz recodepal0
  301.         ret
  302.  
  303. readfile_rgbtopal
  304. ;e=B, d=G, l=R
  305.         call calcRGBtopal_pp
  306.         ld (ix+1),a
  307.         call calcRGBtopal_pp
  308.         ld (ix),a
  309.         inc ix
  310.         inc ix
  311.         ret
  312.  
  313. calcRGBtopal_pp
  314. ;e=B, d=G, l=R
  315. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  316.         xor a
  317.         rl e  ;B
  318.         rra
  319.         rl l  ;R
  320.         rra
  321.         rrca
  322.         rrca
  323.         rl d  ;G
  324.         rra
  325.         rl e  ;b
  326.         rra
  327.         rl l  ;r
  328.         rra
  329.         rl d  ;g
  330.         rra
  331.         cpl
  332.         ret
  333.  
  334. ;INTSTACK ;затирает процедуры выше (по доке надо 0x3b00+)
  335.  
  336. pal
  337.         ds 32
  338.      
  339.         include "../../_sdk/file.asm"
  340. ;dirname
  341. ;        db "eric",0
  342. gfxname
  343.         db "eric/ericgfx.bmp",0
  344.  
  345.         align 256
  346. trecodebyteleft
  347.         dup 256
  348. ;%00003210 => %.3...210
  349. _3=$&8
  350. _210=$&7
  351.         db (_3*0x08) + (_210*0x01)
  352.         edup
  353.        
  354. trecodebyteright
  355.         dup 256
  356. ;%00003210 => %3.210...
  357. _3=$&8
  358. _210=$&7
  359.         db (_3*0x10) + (_210*0x08)
  360.         edup
  361.  
  362.         endif
  363.  
  364. wasmuz
  365.         incbin "ericmuz.bin"
  366. muzsz=$-wasmuz
  367.  
  368. end
  369.  
  370.         display "End=",end
  371.         ;display "Free after end=",/d,#c000-end
  372.         display "Size ",/d,end-begin," bytes"
  373.         savebin "eric.com",begin,end-begin