?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         include "sysdefs.asm"
  2.        
  3.         macro YIELD ;use instead of HALT
  4.         OS_YIELD
  5.         endm
  6.        
  7.         macro YIELDKEEP ;if you want reentry in this frame
  8.         OS_YIELDKEEP
  9.         endm
  10.  
  11.         macro SETXY_ ;set cursor position (in: de=YX, top left is 0;0)
  12.         ;OS_SETXY
  13.         call setxy
  14.         endm
  15.  
  16.         macro CLS_ ;clear visible area of terminal
  17.         ;ld e,0
  18.         ;OS_CLS
  19.         call clearterm
  20.         endm
  21.  
  22.         macro PRCHAR_ ;send char to stdout (in: A=char)
  23.         ;PRCHAR
  24.         call sendchar
  25.         endm
  26.  
  27.         macro GETCHAR_ ;read char from stdin (out: A=char, CY=error)
  28.         ;GET_KEY
  29.         call receivechar
  30.         endm
  31.  
  32.         macro GETKEY_ ;read key from stdin (out: A=keylang, C=keynolang(???TODO), CY=error)
  33.         ;GET_KEY
  34.         call receivekey
  35.         endm
  36.  
  37.         macro SETCOLOR_ ;setcolor (macro SETCOLOR_) - set color attribute (in: d=paper, e=ink)
  38.         ;ld a,d
  39.         ;add a,a
  40.         ;add a,a
  41.         ;add a,a
  42.         ;or e
  43.         ;ld e,a
  44.         ;OS_SETCOLOR
  45.         call setcolor
  46.         endm
  47.  
  48.         macro YIELDGETKEY ;out: nz=nokey, a=keylang, c=keynolang
  49.         YIELD ;halt ;если сделать просто di:rst 0x38, то 1.сдвинем таймер и 2.можем потерять кадровое прерывание, а если без ei, то будут глюки
  50.         GET_KEY
  51.         or a ;cp NOKEY ;keylang==0?
  52.         jr nz,$+3
  53.         cp c ;keynolang==0?
  54.         endm
  55.         macro YIELDGETKEYLOOP
  56. _1=$
  57.         YIELDGETKEY
  58.         jr z,_1
  59.         endm
  60.  
  61.         macro WAITPID ;wait task E to close
  62.         ;push de
  63.         ;YIELD ;чтобы запускаемая задача успела захватить фокус
  64.         ;ld e,-1
  65.         ;OS_SETGFX ;disable gfx, give focus (если не сделать YIELD, фокус отдаётся не тому приложению, какое мы ждём!)
  66.         ;ld a,e
  67.         ;pop de
  68.         ;ld d,a
  69.         push de
  70.         OS_SETWAITING
  71.         pop de
  72. _1=$
  73.         push de
  74.         YIELD
  75.         ;call receivechar
  76.         pop de
  77.         push de
  78.         OS_WAITPID
  79.         pop de
  80.         or a
  81.         jr nz,_1
  82.         ;push de
  83.         ;OS_RESETWAITING
  84.         ;pop de
  85.         ;ld e,d ;ld e,6 ;textmode
  86.         ;OS_SETGFX ;take focus (can be random after closing cmd)
  87.         endm
  88.        
  89. ;from CP/M (try to avoid use!) FCB = file control block (size FCB_sz)    
  90.         macro OS_PRCHAR ;e=char
  91.         ld c,CMD_PRCHAR
  92.         CALLBDOS_NOPARAM_A
  93.         endm
  94.         macro OS_SETDRV ;e=drive ;out: a!=0 => not mounted, [l=number of drives]
  95.         ld c,CMD_SETDRV
  96.         CALLBDOS_NOPARAM_A
  97.         endm
  98.         macro OS_FOPEN ;de = pointer to unopened FCB
  99.         ld c,CMD_FOPEN
  100.         CALLBDOS_NOPARAM_A
  101.         endm
  102.         macro OS_FCLOSE ;de = pointer to opened FCB
  103.         ld c,CMD_FCLOSE
  104.         CALLBDOS_NOPARAM_A
  105.         endm
  106.         macro OS_FSEARCHFIRST ;de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA. DTA had to set every time
  107.         ld c,CMD_FSEARCHFIRST
  108.         CALLBDOS_NOPARAM_A
  109.         endm
  110.         macro OS_FSEARCHNEXT ;(NOT CP/M compatible!!!)de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA. DTA had to set every time
  111.         ld c,CMD_FSEARCHNEXT
  112.         CALLBDOS_NOPARAM_A
  113.         endm
  114.         macro OS_FDEL ;DEPRECATED!!!!! ;DE = Pointer to unopened FCB
  115.         ld c,CMD_FDEL
  116.         CALLBDOS_NOPARAM_A
  117.         endm
  118.         macro OS_FREAD ;DE = Pointer to opened FCB, read 128 bytes in DTA, out: a=128^bytes actually read (not CP/M!)
  119.         ld c,CMD_FREAD
  120.         CALLBDOS_NOPARAM_A
  121.         endm
  122.         macro OS_FWRITE ;DE = Pointer to opened FCB, write 128 bytes from DTA
  123.         ld c,CMD_FWRITE
  124.         CALLBDOS_NOPARAM_A
  125.         endm
  126.         macro OS_FCREATE ;DE = Pointer to unopened FCB
  127.         ld c,CMD_FCREATE
  128.         CALLBDOS_NOPARAM_A
  129.         endm
  130.         macro OS_SETDTA ;DE = data transfer address (DTA)
  131.         ld c,CMD_SETDTA
  132.         CALLBDOS_NOPARAM_A
  133.         endm
  134.  
  135. ;from MSX-DOS
  136.         macro OS_SEEKHANDLE ;b=file handle, dehl=offset
  137.         ld c,CMD_SEEKHANDLE
  138.         CALLBDOS_NOPARAM_A
  139.         endm
  140.         macro OS_OPENHANDLE ;DE = Drive/path/file ASCIIZ string ;out: B = new file handle, A=error
  141.         ld c,CMD_OPENHANDLE
  142.         CALLBDOS_NOPARAM_A
  143.         endm
  144.         macro OS_CREATEHANDLE ;DE = Drive/path/file ASCIIZ string ;out: B = new file handle, A=error
  145.         ld c,CMD_CREATEHANDLE
  146.         CALLBDOS_NOPARAM_A
  147.         endm
  148.         macro OS_CLOSEHANDLE ;B = file handle, out: A=error
  149.         ld c,CMD_CLOSEHANDLE
  150.         CALLBDOS_NOPARAM_A
  151.         endm
  152.         macro OS_READHANDLE ;B = file handle, DE = Buffer address, HL = Number of bytes to read, out: HL = Number of bytes actually read, A=error
  153.         ld c,CMD_READHANDLE
  154.         CALLBDOS_NOPARAM_A
  155.         endm
  156.         macro OS_WRITEHANDLE ;B = file handle, DE = Buffer address, HL = Number of bytes to write, out: HL = Number of bytes actually written, A=error
  157.         ld c,CMD_WRITEHANDLE
  158.         CALLBDOS_NOPARAM_A
  159.         endm
  160.         macro OS_RENAME ;DE = Drive/path/file ASCIIZ string, HL = New filename ASCIIZ string (NOT MSXDOS compatible! with Drive/path!) ;RENAME OR MOVE FILE
  161.         ld c,CMD_RENAME
  162.         CALLBDOS_NOPARAM_A
  163.         endm
  164.         macro OS_CHDIR ;DE = Pointer to ASCIIZ string. Out A=error
  165.         ld c,CMD_CHDIR
  166.         CALLBDOS_NOPARAM_A
  167.         endm
  168.         macro OS_PARSEFNAME ;de(dotname) -> hl(cpmname) ;out: de=pointer to termination character, hl=buffer filled in
  169.         ld c,CMD_PARSEFNAME
  170.         CALLBDOS_NOPARAM_A
  171.         endm
  172.         macro OS_GETPATH ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer ;out: DE = Filled in with whole path string (WITH DRIVE! Finished by slash only if root dir), HL = Pointer to start of last item
  173.         ld c,CMD_GETPATH
  174.         CALLBDOS_NOPARAM_A
  175.         endm
  176.         macro OS_DELETE ;DE = Drive/path/file ASCIIZ string, out: A = Error
  177.         ld c,CMD_DELETE
  178.         CALLBDOS_NOPARAM_A
  179.         endm
  180.  
  181. ;invented  
  182.         macro OS_HIDEFROMPARENT ;for tasks with their own screen handling
  183.         ld c,CMD_HIDEFROMPARENT
  184.         CALLBDOS_NOPARAM_A
  185.         endm
  186.         macro OS_SETSTDINOUT ;e=stdin, d=stdout, h=stderr
  187.         ld c,CMD_SETSTDINOUT
  188.         CALLBDOS_NOPARAM_A
  189.         endm
  190.         macro OS_GETSTDINOUT ;e=stdin, d=stdout, h=stderr
  191.         ld c,CMD_GETSTDINOUT
  192.         CALLBDOS_NOPARAM_A
  193.         endm
  194.         macro OS_PLAYCOVOX ;hl=data (0xc000+, 0x00=end), de=pagetable (0x0000+), hx=delay (18=11kHz, 7=22kHz, 1=44kHz)
  195.         ld c,CMD_PLAYCOVOX
  196.         CALLBDOS_NOPARAM_A
  197.         endm
  198.         macro OS_SETMUSIC ;hl=muzaddr (0x4000..0xffff), a=muzpg (pages in 0x8000, 0xc000 are taken from current user memory)
  199.         ld c,CMD_SETMUSIC
  200.         CALLBDOS
  201.         endm
  202.         macro OS_READSECTORS ;b=drive, de=buffer, ixhl=sector number, a=count
  203.         ld c,CMD_READSECTORS
  204.         CALLBDOS
  205.         endm
  206.         macro OS_WRITESECTORS ;b=drive, de=buffer, ixhl=sector number, a=count
  207.         ld c,CMD_WRITESECTORS
  208.         CALLBDOS
  209.         endm
  210.         macro OS_GETFILESIZE ;b=handle, out: dehl=file size
  211.         ld c,CMD_GETFILESIZE
  212.         CALLBDOS_NOPARAM_A
  213.         endm
  214.         macro OS_SETBORDER ;e=0..15
  215.         ld c,CMD_SETBORDER
  216.         CALLBDOS_NOPARAM_A
  217.         endm
  218.         macro OS_SETWAITING ;set WAITING state for current task
  219.         ld c,CMD_SETWAITING
  220.         CALLBDOS_NOPARAM_A
  221.         endm
  222.         macro OS_NETSOCKET ;D=address family (2=inet, 23=inet6), E=socket type (0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip) ;out: L=SOCKET (if L < 0 then A=error)
  223.         ld l,0x01
  224.         ld c,CMD_WIZNETOPEN
  225.         CALLBDOS
  226.         endm
  227.         macro OS_NETSHUTDOWN;A=SOCKET ; out: if HL < 0 then A=error
  228.         ld l,0x02
  229.         ld c,CMD_WIZNETOPEN
  230.         CALLBDOS
  231.         endm
  232.         macro OS_NETCONNECT;A=SOCKET, DE=sockaddr ptr {unsigned char sin_family /*net type*/; unsigned short sin_port; struct in_addr sin_addr /*4 bytes IP*/; char sin_zero[8];}; out: if HL < 0 then A=error
  233.         ld l,0x03
  234.         ld c,CMD_WIZNETOPEN
  235.         CALLBDOS
  236.         endm
  237.         macro OS_ACCEPT;A=SOCKET; out: HL
  238.         ld l,0x04
  239.         ld c,CMD_WIZNETOPEN
  240.         CALLBDOS
  241.         endm
  242.         macro OS_BIND;A=SOCKET, DE=sockaddr ptr {unsigned char sin_family /*net type*/; unsigned short sin_port; struct in_addr sin_addr /*4 bytes IP*/; char sin_zero[8];}
  243.         ld l,0x05
  244.         ld c,CMD_WIZNETOPEN
  245.         CALLBDOS
  246.         endm
  247.         macro OS_LISTEN;A=SOCKET
  248.         ld l,0x06
  249.         ld c,CMD_WIZNETOPEN
  250.         CALLBDOS
  251.         endm
  252.         macro OS_WIZNETCLOSE;A=SOCKET
  253.         ld c,CMD_WIZNETCLOSE
  254.         CALLBDOS
  255.         endm
  256.         macro OS_WIZNETREAD;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error
  257.         ld c,CMD_WIZNETREAD
  258.         CALLBDOS
  259.         endm
  260.         macro OS_WIZNETWRITE;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error
  261.         ld c,CMD_WIZNETWRITE
  262.         CALLBDOS
  263.         endm
  264.         macro OS_DROPAPP ;e=id
  265.         ld c,CMD_DROPAPP
  266.         CALLBDOS
  267.         endm
  268.         macro OS_GETAPPMAINPAGES ;e=id ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id, a=error
  269.         ld c,CMD_GETAPPMAINPAGES
  270.         CALLBDOS
  271.         endm
  272.         macro OS_GETXY ;out: de=yx ;GET CURSOR POSITION
  273.         ld c,CMD_GETXY
  274.         CALLBDOS
  275.         endm
  276.         macro OS_GETTIME ;out: ix=date, hl=time
  277.         ld c,CMD_GETTIME
  278.         CALLBDOS
  279.         endm
  280.         macro OS_GETFILETIME ;de=Drive/path/file ASCIIZ string, out: ix=date, hl=time
  281.         ld c,CMD_GETFILETIME
  282.         CALLBDOS
  283.         endm
  284.         macro OS_SETFILETIME ;de=Drive/path/file ASCIIZ string, ix=date, hl=time
  285.         ld c,CMD_SETFILETIME
  286.         CALLBDOS
  287.         endm
  288.         macro OS_TELLHANDLE ;b=file handle, out: dehl=offset ;GET POSITION IN FILE
  289.         ld c,CMD_TELLHANDLE
  290.         CALLBDOS
  291.         endm
  292.         macro OS_SCROLLUP ;de=topyx, hl=hgt,wid ;x, wid even ;TEXTMODE ONLY
  293.         ld c,CMD_SCROLLUP
  294.         CALLBDOS
  295.         endm
  296.         macro OS_SCROLLDOWN ;de=topyx, hl=hgt,wid ;x, wid even ;TEXTMODE ONLY
  297.         ld c,CMD_SCROLLDOWN
  298.         CALLBDOS
  299.         endm
  300.         macro OS_FWRITE_NBYTES ;hl=bytes, de=FCB ;don't use! ;TODO выбросить
  301.         ld c,CMD_FWRITE_NBYTES
  302.         CALLBDOS
  303.         endm
  304.         macro OS_SETMAINPAGE ;e=page for 0x0000
  305.         ld c,CMD_SETMAINPAGE
  306.         CALLBDOS
  307.         endm
  308.         macro OS_SETSYSDRV ;out: a!=0 => not mounted, l=number of drives
  309.         ld c,CMD_SETSYSDRV
  310.         CALLBDOS
  311.         endm
  312.         macro OS_MKDIR ;DE = Pointer to ASCIIZ string, out: a
  313.         ld c,CMD_MKDIR
  314.         CALLBDOS
  315.         endm
  316.         macro OS_WAITPID ;e=id ;check if app closed, out: a=0 => OK (and reset waiting), or else a!=0
  317.         ld c,CMD_WAITPID
  318.         CALLBDOS
  319.         endm
  320.         macro OS_FREEZEAPP ;e=id ;disable app and make non-graphic
  321.         ld c,CMD_FREEZEAPP
  322.         CALLBDOS
  323.         endm
  324.         macro OS_GETATTR ;out: a ;READ ATTR AT CURSOR POSITION
  325.         ld c,CMD_GETATTR
  326.         CALLBDOS
  327.         endm
  328.         macro OS_MOUNT ;e=drive, out: a
  329.         ld c,CMD_MOUNT
  330.         CALLBDOS
  331.         endm
  332.         macro OS_GETKEYMATRIX ;out: bcdehlix = halfrows cs...space
  333.         ld c,CMD_GETKEYMATRIX
  334.         CALLBDOS
  335.         endm
  336.         macro OS_GETTIMER ;out: hlde=timer
  337.         ld c,CMD_GETTIMER
  338.         CALLBDOS
  339.         endm
  340.         macro OS_YIELD ;schedule to another app (use YIELD macro instead of HALT!!!)
  341.         ld c,CMD_YIELD
  342.         CALLBDOS
  343.         endm
  344.         macro OS_RUNAPP ;e=id ;ACTIVATE DISABLED APP
  345.         ld c,CMD_RUNAPP
  346.         CALLBDOS
  347.         endm
  348.         macro OS_NEWAPP ;out: b=id, a=error, dehl=newapp pages in 0000,4000,8000,c000 ;MAKE NEW DISABLED APP
  349.         ld c,CMD_NEWAPP
  350.         CALLBDOS
  351.         endm
  352.         macro OS_PRATTR ;e=color byte ;DRAW ATTR AT CURSOR POSITION
  353.         ld c,CMD_PRATTR
  354.         CALLBDOS
  355.         endm
  356.         macro OS_CLS ;e=color byte
  357.         ld c,CMD_CLS
  358.         CALLBDOS
  359.         endm
  360.         macro OS_SETCOLOR ;e=color byte
  361.         ld c,CMD_SETCOLOR
  362.         CALLBDOS
  363.         endm
  364.         macro OS_SETXY ;de=yx ;SET CURSOR POSITION
  365.         ld c,CMD_SETXY
  366.         CALLBDOS
  367.         endm
  368.         macro OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  369.         ld c,CMD_SETGFX
  370.         CALLBDOS
  371.         endm
  372.         macro OS_SETPAL ;de=palette (32 bytes)
  373.         ld c,CMD_SETPAL
  374.         CALLBDOS
  375.         endm
  376.         macro OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  377.         ld c,CMD_GETMAINPAGES
  378.         CALLBDOS
  379.         endm
  380.         macro OS_NEWPAGE ;out: a=0 (OK)/!=0 (fail), e=page
  381.         ld c,CMD_NEWPAGE
  382.         CALLBDOS
  383.         endm
  384.         macro OS_DELPAGE ;e=page ;GIVE SOME PAGE BACK TO THE OS
  385.         ld c,CMD_DELPAGE
  386.         CALLBDOS
  387.         endm
  388.         macro OS_SETSCREEN ;e=screen=0..1
  389.         ld c,CMD_SETSCREEN
  390.         CALLBDOS
  391.         endm
  392.         ;macro OS_GETSCREENPAGES ;DEPRECATED!!!! out: de=pages of screen 0 (d=higher page), hl=pages of screen 1 (h=higher page)
  393.         ;ld c,CMD_GETSCREENPAGES
  394.         ;CALLBDOS
  395.         ;endm
  396.         macro OS_YIELDKEEP ;schedule to another app, can return in this frame
  397.         ld c,CMD_YIELDKEEP
  398.         CALLBDOS
  399.         endm
  400.  
  401. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  402.        
  403.         macro QUIT
  404.         rst 0 ;close app
  405.         endm
  406.  
  407.         macro CALLBDOS ;don't use directly CALLBDOS or call 0x0005!!!
  408.         ex af,af'
  409.        call 0x0005 ;c=CMD
  410.        endm
  411.        macro CALLBDOS_NOPARAM_A ;don't use directly CALLBDOS or call 0x0005!!!
  412.         call 0x0005 ;c=CMD
  413.         endm
  414.  
  415.         macro GET_KEY
  416.         rst 0x08 ;out: a=key (NOKEY=no key), de=mouse position (y,x), l=mouse buttons (bits 0,1,2: 0=pressed)+mouse wheel (bits 7..4), h=high bits of key|register, bc=keynolang, nz=no focus (mouse position=0, ignore it!)
  417.         endm
  418.  
  419.         macro PRCHAR
  420.         rst 0x10 ;a=char ;spoils all registers!
  421.         endm
  422.  
  423.         macro SETPG16K
  424.         rst 0x18 ;set page "a" in 0x4000 ;spoils BC
  425.         endm
  426.        
  427.         macro SETPG32KLOW
  428.         rst 0x20 ;set page "a" in 0x8000 ;spoils BC
  429.         endm
  430.        
  431.         macro SETPG32KHIGH
  432.         rst 0x28 ;set page "a" in 0xc000 ;spoils BC
  433.         endm
  434.  
  435.         macro STANDARDPAL ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  436.         dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  437.         dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  438.         endm
  439.