Subversion Repositories Kolibri OS

Rev

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

  1. ; KolSPForth v12
  2.  
  3. ;Memory Map
  4. ;
  5. ;0
  6. ;0x02C7D        ;I_END
  7. ;0x05430        ;CTOP
  8.  
  9. ;0x3F800        ;Data stack
  10. ;0x3FA00        ;return stack
  11. ;0x3FC00        ;User
  12. ;0x3FE00        ;TIB
  13. ;0x30000        ;FILE BUFF
  14. ;0x40000 (256K)
  15.  
  16.    ;; Version control
  17.  
  18.    VER             EQU     1                       ;major release version
  19.    EXT             EQU     0                       ;minor extension
  20.  
  21.    ;; Constants
  22.  
  23.    TRUEE                EQU     -1                      ;true flag
  24.  
  25.    COMPO                EQU     040H                    ;lexicon compile only bit
  26.    IMEDD                EQU     080H                    ;lexicon immediate bit
  27.    MASKK                EQU     01FH                    ;lexicon bit mask
  28.  
  29.    CELLL                EQU     4                       ;size of a cell
  30.    BASEE                EQU     10                      ;default radix
  31.    VOCSS                EQU     8                       ;depth of vocabulary stack
  32.  
  33.    BKSPP                EQU     8                       ;back space
  34.    LF           EQU     10                      ;line feed
  35.    CRR          EQU     13                      ;carriage return
  36.    ERR          EQU     27                      ;error escape
  37.    TIC          EQU     39                      ;tick
  38.  
  39.    CALLL                EQU     0E8H                    ;CALL opcodes
  40.  
  41.    ROWH   EQU 13
  42.    KEY_DELAY EQU 20
  43.    FW_WIDTH equ 500
  44.    FW_HEIGHT equ 352
  45.  
  46.  
  47.    ;; Memory allocation
  48.  
  49.    EM           EQU     256*1024                ;top of memory
  50.    FILE_BS      EQU     64*1024                 ;file buff size
  51.    US           EQU     128*CELLL               ;user area size in cells
  52.    RTS          EQU     1024*CELLL              ;return stack/TIB size
  53.  
  54.    FILE_B       EQU     EM-FILE_BS              ;terminal input buffer (TIB)
  55.    TIBB         EQU     FILE_B-RTS              ;terminal input buffer (TIB)
  56. ;   UPP         EQU     TIBB-US                 ;start of user area (UP0)
  57.    RPP          EQU     UPP-RTS                 ;start of return stack (ESP0)
  58.    SPP          EQU     RPP-RTS                 ;start of data stack (EBP0)
  59.  
  60. LastNFA = 0
  61.  
  62. LastCFA EQU INIT
  63.  
  64.  
  65.  
  66. macro AHEADER FLAG,ID,F_CFA {
  67.         db      FLAG
  68.         DD      F_CFA
  69.         DD      LastNFA
  70. The_Nfa = $
  71.         DB      ID,0
  72. LastNFA = The_Nfa
  73. F_CFA:
  74. }
  75.  
  76. macro cfa_AHEADER FLAG,ID,F_CFA {
  77.         db      FLAG
  78.         DD      cfa_#F_CFA
  79.         DD      LastNFA
  80. The_Nfa = $
  81.         DB      ID,0
  82. LastNFA = The_Nfa
  83. cfa_#F_CFA:
  84. }
  85.  
  86.  
  87. ;; Main entry points and COLD start data
  88.  
  89.  use32
  90.  format binary as ""
  91.  
  92.         org    0x0
  93.  
  94.         db     'MENUET01'
  95.         dd     0x01
  96.         dd     ORIG         ; start of code
  97.         dd     I_END        ; size of image
  98. MEMS:   dd     EM       ; memory for app
  99.         dd     SPP          ; esp
  100.         dd     params
  101.         dd     cur_dir_path
  102.  
  103.  lang fix ru
  104.  include 'MACROS.INC'
  105.  include '..\..\proc32.inc'
  106.  
  107. align 4
  108. proc strncmp stdcall, s1:dword, s2:dword, n:dword
  109.  
  110.            push esi
  111.            push edi
  112.            mov ecx, [n]
  113.            test ecx, ecx         ; Max length is zero?
  114.            je .done
  115.  
  116.            mov esi, [s1]         ; esi = string s1
  117.            mov edi, [s2]         ; edi = string s2
  118.            cld
  119. .compare:
  120.            cmpsb                 ; Compare two bytes
  121.            jne .done
  122.            cmp byte [esi-1], 0   ; End of string?
  123.            je .done
  124.            dec ecx               ; Length limit reached?
  125.            jne .compare
  126. .done:
  127.            seta al               ; al = (s1 > s2)
  128.            setb ah               ; ah = (s1 < s2)
  129.            sub al, ah
  130.            movsx eax, al         ; eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1
  131.            pop edi
  132.            pop esi
  133.            ret
  134. endp
  135.  
  136. align 4
  137. proc GetPr stdcall, exp:dword, sz_name:dword
  138.            mov edx, [exp]
  139. .next:
  140.            push edx
  141.            stdcall strncmp, edx, [sz_name], 16
  142.            pop edx
  143.            test eax, eax
  144.            jz .ok
  145.            mov edx, [edx-4]
  146.            test edx, edx
  147.            jnz .next
  148.         mov eax,edx
  149.            ret
  150. .ok:
  151.            mov eax, [edx-8]
  152.            ret
  153. endp
  154.  
  155. AHEADER 0 ,'GETPR',cfa_GETPR
  156.  JMP GetPr
  157.  
  158.  
  159.    ORIG:
  160.  
  161.         MOV     EBP,RPP                 ;initialize RP
  162.         CLD                             ;ESI gets incremented
  163.         finit
  164.         call draw_window
  165.         call  calc_lines
  166.         XCHG    ESP,EBP
  167.         CALL amain
  168. BYE:    mcall -1
  169.        
  170.  
  171.    ULAST:    ;      DD      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  172.  
  173.  
  174.  draw_cursor:
  175.  
  176.  draw_window:
  177.         pusha
  178.         mcall 12,1
  179.         mov   [fRed],ebx
  180.         mcall 0, <0,FW_WIDTH>, <0,FW_HEIGHT>, 0x54000000
  181.         ; mcall 0,,,COL_WINDOW_BG, ,title ; define window
  182.         mcall 71, 1, header
  183.  
  184.         mcall 9,pinfo,-1
  185.         mov   eax,[pinfo.x_size]
  186.         cdq
  187.         sub   eax,20
  188.         mov   ebx,6
  189.         div   ebx
  190.         mov   [pinfo.x_start],eax
  191.  
  192.         mov   eax,[pinfo.y_size]
  193.         cdq
  194.         sub   eax,40
  195.         mov   ebx,ROWH
  196.         div   ebx
  197.  
  198.         mov   [pinfo.y_start],eax
  199.         call  erase_screen
  200.         mcall 12, 2
  201.         mcall 67,-1,-1,FW_WIDTH,FW_HEIGHT
  202.         popa
  203.         ret
  204.  
  205.  
  206. macro GetSkinHeight
  207. {
  208.         mov  eax,48
  209.         mov  ebx,4
  210.         int 0x40
  211. }
  212.  
  213. erase_screen:
  214.         GetSkinHeight
  215.         mov ecx,eax
  216.         shl ecx,16
  217.         add ecx,[pinfo.y_size]
  218.         sub ecx,eax
  219.         sub ecx,4              
  220.         mov   ebx,[pinfo.x_size]
  221.         add   ebx,5 shl 16 - 9
  222.         mcall 13,,,0;xff
  223.         ret
  224.  
  225.  
  226. AHEADER 0,"CC_LINES",cfa_CC_LINES
  227.  calc_lines:
  228.          cmp dword[UPP+10*4],0
  229.          je  .ex
  230.                 pusha
  231.                 mov  ebp,os_work
  232.                 mov  al,0xd
  233.                 mov  edi,screen_buf
  234. ;               mov  esi,[cursor]
  235. ;               mov  byte[esi],'_'
  236. ;               inc  [cursor]
  237.         .again:
  238.                 mov  [ebp],edi
  239.                 mov  esi,[cursor]
  240.                 sub  esi,edi
  241.                 mov  ecx,[pinfo.x_start]
  242. ;   test ecx,ecx
  243. ;   jnz  .no0
  244. ;   inc  ecx
  245. ;  .no0:
  246.                 cmp  ecx,esi
  247.                 jbe  .ok
  248.                 mov  ecx,esi
  249.         .ok:
  250.                 repne scasb
  251.                 jecxz .nocrlf
  252.                 cmp  byte[edi],10
  253.                 jne  .nocrlf
  254.                 inc  edi
  255.         .nocrlf:
  256.                 mov  ecx,edi
  257.                 sub  ecx,[ebp]
  258.                 add  ebp,8
  259.                 mov  [ebp-4],ecx
  260.                 cmp  edi,[cursor]
  261.                 jb   .again
  262.                 and  dword[ebp],0
  263.  ;              dpd  esi
  264.                 mov  eax,[pinfo.y_start]
  265.                 shl  eax,3
  266.                 sub  ebp,eax
  267.                 cmp  ebp,os_work
  268.                 jae  .ok2
  269.                 mov  ebp,os_work
  270.         .ok2:
  271.          cmp  ebp,[last_ebp]
  272.    je   .ok3
  273.    mov  [last_ebp],ebp
  274.    call erase_screen
  275.   .ok3:
  276.                 mov  ebx,10 shl 16 +30
  277.  ;              ud2
  278.         .newl:
  279.                 mcall 4,,0xffffff,[ebp],[ebp+4]
  280.                 add  ebp,8
  281.                 add  ebx,ROWH
  282.                 cmp  dword[ebp],0
  283.                 jnz  .newl
  284.                 SUB   ebx,ROWH
  285.                 call set_cur
  286.                 popa
  287.  .ex:
  288.                 ret
  289.  
  290.  
  291. set_cur:
  292.         MOV     ecx,EBX
  293.         shl     ecx,16
  294.         add     ecx,EBX
  295.         MOV     EAX,[ebp+4-8]
  296.         add     EAX,2
  297.         imul    EAX,6
  298.         mov     EBX,EAX
  299.         shl     ebx,16
  300.         add     EBX,EAX
  301.         mov     [lastcur],ecx
  302.         mov     [lastcur+4],ebx
  303.         ret
  304.  
  305.  e_calc_lines:
  306.          cmp dword[UPP+10*4],0
  307.          je  e_.ex
  308.                 pusha
  309.                 mov  ebp,os_work
  310.                 mov  al,0xd
  311.                 mov  edi,screen_buf
  312. ;               mov  esi,[cursor]
  313. ;               mov  byte[esi],'_'
  314. ;               inc  [cursor]
  315.         e_.again:
  316.                 mov  [ebp],edi
  317.                 mov  esi,[cursor]
  318.                 sub  esi,edi
  319.                 mov  ecx,[pinfo.x_start]
  320. ;   test ecx,ecx
  321. ;   jnz  .no0
  322. ;   inc  ecx
  323. ;  .no0:
  324.                 cmp  ecx,esi
  325.                 jbe  e_.ok
  326.                 mov  ecx,esi
  327.         e_.ok:
  328.                 repne scasb
  329.                 jecxz e_.nocrlf
  330.                 cmp  byte[edi],10
  331.                 jne  e_.nocrlf
  332.                 inc  edi
  333.         e_.nocrlf:
  334.                 mov  ecx,edi
  335.                 sub  ecx,[ebp]
  336.                 add  ebp,8
  337.                 mov  [ebp-4],ecx
  338.                 cmp  edi,[cursor]
  339.                 jb   e_.again
  340.                 and  dword[ebp],0
  341.  ;              dpd  esi
  342.                 mov  eax,[pinfo.y_start]
  343.                 shl  eax,3
  344.                 sub  ebp,eax
  345.                 cmp  ebp,os_work
  346.                 jae  e_.ok2
  347.                 mov  ebp,os_work
  348.         e_.ok2:
  349.          cmp  ebp,[last_ebp]
  350.    je   e_.ok3
  351.    mov  [last_ebp],ebp
  352.         cmp  byte[edi],10
  353.         jne  e_.ok3
  354.  
  355.    call erase_screen
  356.   e_.ok3:
  357.                 mov  ebx,10 shl 16+30
  358.  ;              ud2
  359.         e_.newl:
  360. ;               mcall 4,,0xffffff,[ebp],[ebp+4]
  361.                 add  ebp,8
  362.                 add  ebx,ROWH
  363.                 cmp  dword[ebp],0
  364.                 jnz  e_.newl
  365.                 SUB   ebx,ROWH
  366.                 mcall 4,,0x00ffffff,[ebp-8],[ebp+4-8]
  367.                 call set_cur
  368.                 popa
  369.  e_.ex:
  370.                 ret
  371.  
  372.  
  373. AHEADER 0,"?KEY",cfa_queKEY
  374.         PUSH    EDI
  375.         XCHG    EBP,ESP
  376.         PUSH    EAX
  377.        POP  EBX
  378.        mov  eax,10
  379.        test ebx,ebx
  380.        jz   QRX0
  381.        inc  eax
  382.     QRX0:
  383.                 XOR     ECX,ECX                 ;EBX=0 setup for false flag
  384.        mcall
  385.        cmp  eax,1
  386.        jne  QRX_
  387.        call draw_window
  388.        call calc_lines
  389.     QRX_:
  390.        cmp  eax,3
  391.        je  BYE
  392.        cmp  eax,2
  393.        jne QRX3
  394.  
  395.        mcall 2
  396.    QRX1:                MOVZX   ECX,AH
  397.    QRX2:                PUSH    ECX                     ;save character
  398.    QRX_TRUE:
  399.                 MOV     ECX,TRUEE               ;true flag
  400.    QRX3:                PUSH    ECX
  401.         POP     eax
  402.         XCHG    EBP,ESP
  403.         POP     EDI
  404.         ret
  405.  
  406.    ;   ?RX              ( -- c T | F )
  407.    ;            Return input character and true, or a false if no input.
  408.  
  409.  
  410. AHEADER 0,"EMIT_N",cfa_EMIT_N
  411.  
  412.         PUSH    EDI
  413.         XCHG    EBP,ESP
  414.                         ;char in AL
  415.                 CMP     AL,0FFH                 ;0FFH is interpreted as input
  416.                 JNZ     TX2                     ;do NOT allow input
  417.                 MOV     AL,32                   ;change to blank
  418.    TX2:
  419.                 mov  ebx,[cursor]
  420.                 mov  [ebx],AL
  421.                 inc  [cursor]
  422.  
  423.         POP     eax
  424.         XCHG    EBP,ESP
  425.         POP     EDI
  426. RET
  427.  
  428.  
  429.  ;; Basic I/O
  430.  
  431. cfa_AHEADER 0,'CL_CUR',CL_CUR
  432.         PUSH    EAX
  433.         mcall 38,[lastcur+4],[lastcur],0
  434.         POP     EAX
  435.         RET
  436.  
  437.         cfa_AHEADER 0,'DR_CUR',DR_CUR
  438.         PUSH    EAX
  439.         mcall 38,[lastcur+4],[lastcur],0x00FF00FF
  440.         POP     EAX
  441.         RET
  442.        
  443.  
  444. COLOR_ORDER equ MENUETOS
  445. include 'gif_lite.inc'
  446.  
  447. cfa_AHEADER 0,'READ_GIF',READ_GIF ;( gif_ptr, out_ptr -- result )
  448.         push esi
  449.         push edi
  450.         push ebp
  451.         mov  edi, eax
  452.         mov  esi,[ebp]
  453.         mov  eax,os_work
  454.         call ReadGIF
  455.         pop  ebp
  456.         pop  edi
  457.         pop  esi
  458.         add  ebp,4
  459.         RET
  460.  
  461.    ;===============================================================
  462.  cursor  dd screen_buf
  463.   fRed  dd 1
  464.  last_ebp dd 0
  465.  
  466.  include 'amain.asm'
  467.  
  468.  header db   'Kolibri Forth v12.1',0
  469.  params: rb 256
  470.  cur_dir_path: rb 4096
  471.  
  472.  
  473.  FINFO:
  474.         .mode dd 0
  475.                   dd 0
  476.         .blk  dd 1
  477.         .buf  dd 0
  478.         .work dd os_work
  479.  
  480.  
  481. lastcur dd 0,0
  482.  
  483. I_END:
  484.  squote_buf rb 1024
  485.  sys_v rd 6
  486.  screen_buf:
  487. ; sc_end:
  488.  rb 4096
  489.  pinfo process_information
  490.  os_work rb 16*1024
  491.  
  492.    CTOP            =     $   ;next available memory in code dictionary
  493.    ;=============================================================