Mercurial > hg > Members > kono > nitros9-code
diff 3rdparty/utils/winfo/winfo.asm @ 396:00b1c751fad7
Added WInfo
author | boisy |
---|---|
date | Mon, 26 Aug 2002 13:25:25 +0000 |
parents | |
children | eee8478186d9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/utils/winfo/winfo.asm Mon Aug 26 13:25:25 2002 +0000 @@ -0,0 +1,734 @@ + nam WInfo + ttl OS9 Level II sub to get window information - Ron Lammardo + +* +* 11/22/87 - Edition #1 - for OS9 Level II V02.00.01 +* 12/22/95 - Edition #2 - for ALL versions of OS-9 by Alan DeKok +* + + ifp1 + use defsfile + endc + +typelang set sbrtn+objct +attrev set reent+revision +revision set 1 + + mod Eom,Mname,Typelang,Attrev,Start,Datend + +mname fcs /WInfo/ +edition fcb 2 edition + + org 0 + use winfodefs + + org 0 +stackadr rmb 2 stack address for return +de rmb 1 device table entry # +sctype rmb 1 screen type +offset rmb 2 screen start offset in block +datimg rmb 2 address of sys DAT image in sysprc +datadr rmb 2 address of sys DAT in system +entry rmb 2 address of currently proccessed window entry +wnum rmb 1 window entry number +scrblock rmb 1 block # containing screen mem +blockcnt rmb 1 # of blocks in screen +wstart rmb 2 x,y coordinates of window start on screen +wsize rmb 2 x,y size of window +cwstart rmb 2 x,y coordinates of current working area +cwsize rmb 2 x,y size of current working area +paramadr rmb 2 address of window name to dump +paramln. rmb 1 +paramln rmb 1 size of window name to dump +vdgadr rmb 2 address of vdg screen +vdgflag rmb 1 vdg screen flag (1=yes) +scrnaddr rmb 2 address of screen +d$devtbl rmb 2 address of device table +mdname rmb 2 adress of module name +drvnam rmb 2 address of device driver name +buffaddr rmb 2 address of return packet +buffln. rmb 1 dummy byte +buffln rmb 1 length of return packet..must be > WI$size +weaddr rmb 2 logical address of window entry insys map (debugging only) +devmaddr rmb 2 device static storage entry in sys map (debugging only) +fgc rmb 1 foreground color +bgc rmb 1 background color +bdc rmb 1 border color +curx rmb 1 x coordinate of cursor +cury rmb 1 y coordinate of cursor +bpr rmb 2 bytes per row +stymark rmb 1 screen type marker byte +paltaddr rmb 2 address of palette registers +msb rmb 1 working field - msb for 2 digit mults +lsb rmb 1 working field - lsb for 2 digit mults +lset rmb 1 logic set # +psetgb rmb 2 pset group/buffer +fontgb rmb 2 font group/buffer +gcurgb rmb 2 gfx cursor group/buffer +minidat rmb 2 temp dat for cpymem +bfngrp rmb 2 buffer #/group return +drawcrsr rmb 4 draw cursor position - xxyy +sysdat rmb 16 system DAT image +devname rmb 5 device descriptor name +devtable rmb 9 device table entry +devmem equ . device memory copy +sc rmb 32 screen table +we rmb 64 window entry + rmb 32 filler so we got 128 bytes for dev memory +datend equ . + +E$Param equ $38 bad Parameter error + +cc3io fcs /CC3IO/ used to compare device driver name + +tmpdat fcb 0,0 mini-dat image for block 0 data fetches + +blnkpalt fcb $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff + fcb $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff + +stytable fcb $01,$03,$03,$0f +blktable fcb 1,1,0,0,2,2,4,4 + +errmsg1 equ * + fcc /Requested device not in device table/ +errm1ln equ *-errmsg1 +errmsg2 fcc /Requested device is not CC3IO/ +errm2ln equ *-errmsg2 +errmsg3 fcc /Can not access window until written to/ +errm3ln equ *-errmsg3 + +start equ * + pshs u,dp save registers + tfr s,d put in 'd' for computations + clrb clear lsb + suba #1 bump down page to make sure we don't conflict + tfr a,dp now set direct page + tfr d,u and set u register + sts <stackadr save address of stack + leax stackadr+2,u start adrress of bytes to init + ldb #devtable end addr..# of bytes to clear + lda #$ff fill character + lbsr zapblock init the characters + +* get passed parameters + + ldx 5,s # of parameters + cmpx #2 do we have two params? + lbne badparms no...error + ldx 7,s 1st param addr (window name addr) + stx <paramadr save the window name addr + os9 F$PrsNam get end of name + lbcs exit exit on error + clra clear msb + std <paramln. save window name length + ldx 11,s 2nd param addr (buffer addr) + stx <buffaddr save the buffer address + ldx 13,s 2nd param length + stx <buffln. save the buffer length address + cmpx #WI$Size check if buffer big enough + lblo smllbuff no..send buffer to small status + +* clear return buffer + + ldx <buffaddr address of return buffer + ldb #WI$ermsg end address to init + lda #$ff fill char + lbsr zapblock zap the block + ldb #40 # of bytes to init + lda #$20 space fill + lbsr zapblock zap the message + +* get system process descriptor for sys DAT image + + leax tmpdat,pcr addr of sys mini-dat + tfr x,d put it in d + ldx #$004C Addr of dat image in system direct page + ldy #2 2 bytes to get + pshs u save u + leau datadr,u addr of receiver + os9 F$CpyMem get it + puls u restore u + lbcs exit exit on error + leax tmpdat,pcr addr of sys mini-data + tfr x,d put it in d + ldx datadr,u physical addr of sys DAT in sys addr map + pshs u save u + leay sysdat,u addr of receiver + sty <datimg save it for later + tfr y,u put in u for call + ldy #16+16+1 16 bytes to get in image + os9 F$CpyMem get it + puls u restore u + lbcs exit and exit on error + + ldx <datimg get ptr to system DAT image + lda 16+16,x grab Level III SCF map info + beq not.l3 + sta 3,x + inca + sta 5,x + +* get offset in system map to device tables +not.l3 ldy #2 2 bytes to get + ldd <datimg addr of sys DAT image + ldx #D.DevTbl addr of device table addr + pshs u save u + leau d$devtbl,u addr of reciever + os9 F$Cpymem get it + puls u restore u + lbcs exit exit on error + clr <de clear device table entry # + ldx d$devtbl,u addr of device table + leax -$0D,x back off one entry for increment in loop + stx d$devtbl,u and save it again + leax devtable,u get the addr of our copy of devtable + stx <entry save the entry addr for later + +* just do an I$Attach instead of rooting through the device table + + lda #READ. read-only permissions + ldx <paramadr point to window name + pshs u save for later + OS9 I$Attach get U=address of device table entry + puls x kill end of device name pointer + lbcs error1 exit on error + + OS9 I$Detach so link count is correct + exg x,u now U=memory, and X=ptr to device table entry + + leay devtable,u addr of reciever + pshs u save u + tfr y,u put reciever addr in u + ldy #9 copy table entry + ldd <datimg addr of sys DAT image + os9 F$Cpymem get it + puls u restore u + lbcs exit exit on error + leax devtable,u + lda V$USRS,x test for entry in use + lbeq error3 if not in use...give out error saying so + +* Alan DeKok's mod: lots of code removed here + +* get driver name offset + + ldx <entry get device entry address + ldx V$DRIV,x get driver module start addr + leax M$Name,x get addr of module name + ldy #2 get 2 bytes + ldd <datimg addr of sys DAT image + pshs u save u + leau mdname,u addr of reciever + os9 F$CpyMem get it + puls u restore u + lbcs exit exit on error + +* now get actual driver name + + ldx <entry addr of deice entry + ldd V$DRIV,x driver module start addr + addd mdname,u + module offset to driver name + tfr d,x put it in x so we can grab it + ldy #5 5 bytes in name (CC3IO) + ldd <datimg addr of sys DAT image + pshs u save u + leau devname,u addr of receiver + os9 F$CpyMem get it + puls u restore u + lbcs exit exit on error + +* we got the requested device...now see if its cc3io + + ldb #5 5 bytes to compare + leax cc3io,pcr get addr of 'CC3IO' + leay devname,u get addr of the driver nam + os9 F$CmpNam see if they're the same + lbcs error2 if not-skip to next entry + +* get the device static storage + + ldx <entry addr of device entry + ldd V$STAT,x addr of static storage + tfr d,x put in x so we can get it + stx <devmaddr save device mem addr + ldd <datimg addr of sys DAT image + ldy #$80 bytes to get + pshs u save u + leau devmem,u addr of receiver + os9 F$CpyMem get it + puls u restore u + lbcs exit exit on error + +* get the window entry number + + leax devmem,u addr of device mem + lda $35,x offset to window entry # + sta wnum,u save it + +* check if its a vdg screen + + clr <vdgflag else clear the flag + leax devmem,u addr of device memory + lda 6,x offset to window type + anda #$80 check the high bit + lbeq vdgscrn if not set,its a vdg screen so jump + +* get actual window entry + + lda wnum,u window entry # + ldb #64 window entry size + mul find offset + addd #$1280 add it to start of window entrys + std <weaddr save window entry address + tfr d,x put in x so we can get it + ldy #64 64 bytes to get in window entry + ldd <datimg addr of sys DAT image + pshs u save u + leau we,u addr of receiver + os9 F$CpyMem get it + puls u restore u + lbcs exit exit on error + + +* check if window ok + + lda we,u check msb of screen table address + cmpa #$ff is it valid ??? + lbeq error3 send error message + +* get screen table entry + + ldx we,u address of screen table + ldy #32 32 bytes in screen table + ldd <datimg addr of sys DAT image + pshs u save u + leau sc,u addr of receiver + os9 F$CpyMem get it + puls u restore u + lbcs exit exit on error + leax sc,u address of screen table + ldb 5,x border prn + stb <bdc save it + ldb ,x screen type + stb <stymark + +* remove bias to get actual screen type + + cmpb #$80 + bls lowtype + ldb #4 4 = 16 colors possible + stb <stymark make that the screen type marker + ldb #$87 + subb ,x + bra getblock +lowtype equ * + addb #4 +getblock equ * + stb <sctype save the screen type + decb decrement for indexing + leax blktable,pcr address of block count table + lda b,x get block count (via indexing table) + sta <blockcnt save it + leax sc,u address of screen table + lda 1,x get first block used + sta <scrblock save it + leax 16,x address of palettes + stx <paltaddr save it for later + leax we,u addr of window entry + +* get screen start in block + + leax $34,x screen start + lda ,x+ get msb + suba #$80 ????? + ldb ,x+ get lsb + std <offset save screen offset + ldy ,x++ get screen start coordinates + sty <wstart save them + ldd ,x++ get screen size (x,y) + std <wsize save it + leax we,u get start of window entry + leax 5,x addr of cwarea start + ldy ,x++ working area start coordinates + sty <cwstart save them + ldd ,x++ working area size coordinates + std <cwsize save them + cmpd <wsize see if its same as total window size + beq getbpr if it is,skip next section + +* adjust block offset to take change working area into account + + clr <msb clear temp area + lda <cwstart x offset of area + lsla multiply by 2 for attribute bytes + sta <lsb save it + lda <cwstart+1 y offset of area + lsla multiply by 2 for attribute bytes + ldb <wsize x-size of window + mul mulitply + addd <msb add x offset of area + addd <offset add original block offset + std <offset save new block offset + +* get # of bytes per row and cursor coordinates + +getbpr equ * + ldx #$1075 address of gfx table start pointer + ldy #2 # of bytes to get + ldd <datimg addr of sys DAT image + pshs u save u + leau msb,u addr of receiver + os9 F$Cpymem get it + puls u restore u + lbcs exit exit on error + lda <wnum get window entry number + ldb #$12 size of gfx table entry + mul get the offset to start of our gfx window entry + addd #1 add 1 for draw cursor start + ldx <msb load addr of table start + leax d,x and add offset + ldy #4 get 4 bytes + ldd <datimg addr of sys DAT image + pshs u save u + leau drawcrsr,u addr of receiver + os9 F$Cpymem get it + puls u restore u + lbcs exit exit on error + + clr <curx clear fields + clr <cury + leax we,u address of window entry + ldd $14,x butes per row + std <bpr save bytes per row + +* get foreground/background prn's + + leay stytable,pcr addr of screen type mask table + ldb <stymark get sty marker byte + decb decrement for indexing + leay b,y addr of mask (via indexing) + ldd $16,x get fore/back palette #'s + anda ,y strip of bias againt mask + andb ,y + sta <fgc save foreground prn + stb <bgc save background prn + + lda $1A,x logic set # + sta <lset save it + lda $1B,x block # of font + ldy $1C,x block offset of font + lbsr fetchit get group/buffer of font + std <fontgb save it + lda $1E,x block # of pset + ldy $1F,x block offset of pset + leay -$20,y back off to get header start of pset + lbsr fetchit get group/buffer of pset + std <psetgb save it + lda $28,x block # of gfx cursor + ldy $29,x block offset of gfx cursor + lbsr fetchit get group/buffer of gfx cursor + std <gcurgb save it + + ldd $0B,x cursor logical address + subd 3,x subtract screen logical start + lbra getcrps get x,y cursor coords + +* get block number and offset in block for VDG type screen + +vdgscrn equ * + leax blnkpalt,pcr address of $ff's for vdg palettes + stx <paltaddr save the addr + lda #$ff fill char + sta <fgc no palettes for vdg screen + sta <bgc + sta <bdc + lda #1 vdgflag=1 + sta <vdgflag + sta <blockcnt 1 block in screen + clra + clrb + std <wstart window starts at 0,0 + std <cwstart + clr <sctype screentype = 0 + leax devmem,u address of device memory + ldd $38,x logical screen start addr + std vdgadr,u msb of vdg address + lsra divide by 16 + lsra + lsra + lsra + lsra divide by 2 + inca add 1 + lsla multiply by 2 + deca subtract 1 + ldx <datimg addr of sys DAT image + ldb a,x add on block # in map and get the physical block + stb <scrblock save it + ldd vdgadr,u get the physical screen address + anda #%00011111 strip off block # bias + std <offset save offset within block + ldd #$2010 32 * 16 screen + std <cwsize save it + std <wsize save it + clr <curx clear cursor offset counters + clr <cury + ldd #$0020 32 bytes/row + std <bpr save it + leax devmem,u address of device memory + ldd $3C,x cursor address + subd $38,x screen address + +getcrps equ * + cmpd <bpr are we done getting row? + blo gotycur yes..skip this + subd <bpr subtract bytes/row + inc <cury increment row # + bra getcrps and check for more + +gotycur equ * + stb <curx save y cursor pos + tst <vdgflag is it vdg screen?? + bne savexcur yes..more processing + lda <sctype get screen type to determine divisor + cmpa #5 is it type 5 screen??? + beq gotxcur go save x cursor position + lsrb divide by two to get actual offset + cmpa #8 is it type 7 screen??? + bne gotxcur go save x cursor position + lsrb divide by two again + +gotxcur equ * + stb <curx save y cursor pos + lbra retbuffr go return buffer + +savexcur equ * + leax devmem,u address of device mem + lda $37,x screen # on display + bne chkmedrs if not 0 then its medium or hi res + tst $45,x test med-res flag + lbeq retbuffr its not hi-res gfx + +chkmedrs equ * + ldb #3 3 bytes per screen table entry + mul get screen table offset + leax $4A,x start of screen tables + leax b,x offset for screen # + inc <vdgflag =2 for med-res gfx + clr <offset screen starts at begin of block + clr <offset+1 + lda ,x+ get start block + sta <scrblock save it + lda ,x+ get block count + lbne vdghires if there its a hi-res + ldx #$0180 BPR for med-res vdg screen + stx <bpr save it for later + lda #%00010000 default mode of 1 + leax devmem,u get start of device mem again + tst $3f,x screen mode + bpl vdgtyp1 if its is..go save it + clra make the mode=0 + +vdgtyp1 equ * + ora $66,x foreground color + sta <sctype thats our screen type + lbra retbuffr go return buffer + +* hi res vdg screen + +vdghires equ * + sta <blockcnt save the block count + lda ,x get the screen type + sta <sctype save it + ldy #$2818 sizex/sizey for screen type 0,1,2 + ldx #$0280 BPR for screen type 0,1,2 + cmpa #2 is screen type <= 2 + bls vdgbpr if yes..go save BPR + ldy #$5018 BPR for screen types 3,4 + ldx #$0500 BPR for screen types 3,4 + +vdgbpr equ * + sty <wsize save the size + sty <cwsize same for current working size + stx <bpr save the bytes per row + leax devmem,u get address of device mem again + leax $6B,x address of palettes + stx <paltaddr save it for later + inc <vdgflag =3 (hi res vdg) + lbra retbuffr + +* dump the screen + +retbuffr equ * + ldx <buffaddr address of return buffer + clra + sta WI$stat,x status is ok (=0) + lda <vdgflag + sta WI$vdg,x + lda <sctype + sta WI$sty,x + lda <scrblock + sta WI$block,x + lda <blockcnt + sta WI$blcnt,x + ldd <offset + std WI$offst,x + lda <wstart + sta WI$cpx,x + lda <wstart+1 + sta WI$cpy,x + lda <wsize + sta WI$szx,x + lda <wsize+1 + sta WI$szy,x + lda <cwstart + sta WI$cwcpx,x + lda <cwstart+1 + sta WI$cwcpy,x + lda <cwsize + sta WI$cwszx,x + lda <cwsize+1 + sta WI$cwszy,x + lda <curx + sta WI$curx,x + lda <cury + sta WI$cury,x + ldd <bpr + std WI$bpr,x + leay we,u + lda $19,y + sta WI$cbsw,x + lda <bdc + sta WI$bdprn,x + lda <fgc + sta WI$fgprn,x + lda <bgc + sta WI$bgprn,x + lda <lset + sta WI$Lset,x + ldd <fontgb + sta WI$FntGr,x + stb WI$FntBf,x + ldd <psetgb + sta WI$PstGr,x + stb WI$PstBf,x + ldd <gcurgb + sta WI$GcrGr,x + stb WI$GcrBf,x + ldd <drawcrsr + std WI$DrCrx,x + ldd <drawcrsr+2 + std WI$DrCry,x + lda edition,pcr + sta WI$Edtn,x + ldd <weaddr + std WI$weadr,x + ldd <devmaddr + std WI$devm,x + leay WI$pregs,x addr of where to move palettes to + ldx <paltaddr addr of palettes + ldd #16 16 bytes to move + lbsr u$movexy move it + bra clrexit done so return from sub + +badparms equ * + ldb #E$Param bad parameter error + bra exit go return it + +clrexit clrb no error..clear b reg +exit equ * + lds <stackadr restore stack + puls u,dp restore u and dp registers + clra clear carry bit + tstb + beq return + coma set carry bit +return equ * + rts + +zapblock equ * + sta ,x+ + decb + bne zapblock + rts + +* fetch 2 bytes from block [a] at offset [y]+3 + + + +fetchit equ * + clr <minidat + sta <minidat+1 + bne fetchok jump if valid block # + clra else clear group # + clrb clear buffer # + rts + +fetchok equ * + pshs x save x + leax 3,y poistion to group # + tfr x,d put in d for arithmetic + anda #%00011111 strip off hig order bytes + tfr d,x and put back in x + leay minidat,u adr of temp DAT image + tfr y,d put in d for os9 call + ldy #2 bytes to get + pshs u save u + leau bfngrp,u addr of receving field + os9 F$Cpymem get it + puls u restore u + lbcs exit exit on error + ldd <bfngrp put it in d for return + puls x restore x + rts + +* move [d] bytes from [x] to [y] + +u$movexy pshs u + tfr d,u +movexy10 lda ,x+ + sta ,y+ + leau -1,u + cmpu #0 + bne movexy10 + puls u,pc + +error1 equ * + ldb #1 error number + pshs b save error # + leax errmsg1,pcr address of error msg + ldd #errm1ln length of error message + bra moverr go move it + +error2 equ * + ldb #2 error number + pshs b save error # + leax errmsg2,pcr address of error msg + ldd #errm2ln length of error message + bra moverr go move it + +error3 equ * + ldb #3 error number + pshs b save error # + leax errmsg3,pcr address of error msg + ldd #errm3ln length of error message + bra moverr go move it + +moverr equ * + ldy <buffaddr address of return buffer + leay WI$ErMsg,y address of error message + lbsr u$movexy + puls b + +storstat equ * + ldy <buffaddr address of return buffer + stb WI$Stat,y save the status byte + lbra clrexit done + + +smllbuff equ * + ldb #$ff buffer too small status # + bra storstat go store status # and exit + + + emod +eom equ *