Subversion Repositories Kolibri OS

Rev

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

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