From 902d43f0e7a2dbd2799b250fda56018d0d65aaa4 Mon Sep 17 00:00:00 2001 From: codebur Date: Sun, 22 Oct 2017 16:30:14 +0200 Subject: [PATCH] initial commit --- CodeBurger.image.zip | Bin 0 -> 26684 bytes README.md | 18 ++++++++++++++++++ draw.asm | 1 + equates.asm | 1 + file.asm | 1 + gen | 1 + globals.asm | 1 + main.asm | 1 + mak | 1 + menu.asm | 1 + sys6.asm | 1 + text.asm | 1 + tools.asm | 1 + windows.asm | 1 + xform.asm | 1 + 15 files changed, 31 insertions(+) create mode 100644 CodeBurger.image.zip create mode 100644 README.md create mode 100644 draw.asm create mode 100644 equates.asm create mode 100644 file.asm create mode 100644 gen create mode 100644 globals.asm create mode 100644 main.asm create mode 100644 mak create mode 100644 menu.asm create mode 100644 sys6.asm create mode 100644 text.asm create mode 100644 tools.asm create mode 100644 windows.asm create mode 100644 xform.asm diff --git a/CodeBurger.image.zip b/CodeBurger.image.zip new file mode 100644 index 0000000000000000000000000000000000000000..77fdabd84f0556a85b9ef518d7339e2a5cfdd479 GIT binary patch literal 26684 zcmYg%1CS<7(B{~-ZSKsDZSENF*tTukwry+2wryj__RaVI7Z=yvm66riRhe1ckx^Cs zq`WjJ7#a}N&*>+lE(-Mj9Y{b(K*F|0#zM{xrp68o=GOYA#wu!XKwhQ))O(esl^=o8 zfc|Mi3n(wW@jp-Z($W3y4Lk4|0=E-fWLAWY8=8ZQFSha~f)fG}remPzDnNT3H1l3+ z#8gO%H(WJHTE?yZ!TPNzxTUcH-Ir{3m(>}4ehLoK1xZj)YIPKbf&E3<; z_?+X}Or0WhUzIUFbS&i{MzIRRpBm>qQIZ9vq0cuOWdfBrTaw1E-1w1_^cUu_V>O~( zkL9U@Q)arkB#l>727h5gC|8~Z=`lZ2<2Ws+Z9EB(s%&b};Zk|_)yeAl@B8efo6~Lt zZAu!`;_6%MUNPagPi5Wvt%j1t*)gZBIQ-vdy|rStx%KvXyX8sslp43^%(}YgatS}O zR;sQmG-kCqEmsnv?-~7>Cn#=DL;NlhMH}e_v@zrc^NJc9jhm9;Xuh-tL;40r8{nd? zTe97yCVFA;oXtA>ov-xlrN`s*StefdWSSl~-yAF79A<;7mBAbFW6~#JampH}`zfLM z)pJ=V;x;SxmM6oW3RJyix-t`=t#x2^l1GqjE55b#pj7x(*Q;L6_g^$JPH4peZynbY zeU^Bedn4<=)yb;Y^7}^3yK_a&yNh`#84+GDCxi8W#Uo#@%PrD5TOX@#hTC2EI5zsO ziF?7p8SkwSix<9Wsg>@}(b=6(J)*(yeRl z_!+`;p$uG33Yj2T+~=3>^pfixRuY!7(k|L2{U@+^A#6wa|HNEeT|fXO=3^`l7&0TJ zGL_3F<%TFOrkvZqDlYJMvelQ)*uN{q1Z9gRc zaFGRpB^33Zs+(g2N{oxb14fjIJn5ym*2e_yR^(*bPxU07q#Tw%vN*9(GE>0f$k6L# z(AM_-FYnNl){7lYOe3vkPDhP{>JC4w>*>~Rsr7|)uu#SlZm9u9lbNS zfUF9ggGShJ>i*^?rWiy_NanbP=S_`UT3X9Nwe|q5*X&?}#v@4PCdOx^pr>YJB}Q3! z0zfs{g%m|pyS&okXhWh`>Ws9ev$EXH?boQ)y%4Uu0)aY{y%q^XxR7zVh@j8ze>)sX zs!fQ$J-ZwTWCX=wf)GOsC?rfMEi^EWrRP#J`9itFl{km8q0IMj`vHK`SbcpEz+aHd z7Lk}eSJV8_h`9XdDQP)3$Rb}2iQCJpM@WOvbgF@DdtOzrz*(k!?%!F*9pUqKJ~X2H zUvZgFxEg&b#i}`1px&l9S)=SeWo7!OvI)>2C`vsH$nZWW;`7-(LQY=e!yvD);?}`X zGHuVvuHlgyA60tn5B)`Q5TmX6$kifX4sMpinBEe4S@d|eadz%eAxZk1+$?#LZJr}ME)S3Z*G=WSwzwhlwHejUgMX0?i4Jn~AC zz0Rtgi-RDO$H5Td#HPHY^g3Y)_G=mj%yi8w*~GBC&9>Do>f%KcEgcIRPNVqRH~A}v zB1SW3tI+FWb=lcRQ~}SkFzRAWskz4#Cmoy{rpovDc1I$n z%%<2#{fEQms6TK0wQm;4!S&P0#Kq^(T;JfpQ8m+oZ#pOqyGfs(|%m0U}#lgSU!I>)oxgdw(mwIjR_ zIuj5{;w+;8KnZMsZgj$*Ve2Xc-KliU$x>Uk zAg%vCza)oc5cP{9OOAdg?}1z{BSW1nA}(+U9#Fv&WZtH+G${}AEaNw3)TwC9HJo4= zgl8!6+i=h?1X6hjex*OTw1GG8JnWER!OobjReX#!!Q_aK<{iVbQv35Vg(rE; zg6qHs}Q!WZfV zS!+UwxfQIr09_;_vC%}W0ik@~WGhmFk%|CQ_;$VLt%06KtRWQ|PNM_qFNl`i( z`y3=uJD7#sj;8TG6@=RFy1mNGGJfy~pztbyqt{wcJ;BV#3Q%=i!l;2!gUJ_Tf~|Yi z#9nO5D=E^*v}Rz%RCXLIE*2R&N>WbE;4~#6&S>gSu&~jQY*(MMUz`%0A_Hvug~|EB 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 blf{2$75|ir`pVz3U%J> Window sub2 xx,xOffset *** sub2 xx2,xOffset *** move4 yy,myRect with the two endpoints has move4 yy2,myRect+4 any points in common with lda yy the visrgn. cmp yy2 Result: Same problem as bcc yOK testing the individual points sta myRect+4 last chance to speed things up: lda yy2 test against the hit region of sta myRect the line segment!!!! yOK lda xx (pretty cool, eh?) cmp xx2 bcc xOK here's how: sta myRect+6 SectRgn rg1Hndl,rg2Hndl,destRHndl lda xx2 bool:=EmptyRgn rgnHndl sta myRect+2 xOK inc myRect+4 Problem with RectInVisRgn: h+v inc myRect+6 Problem with PtInPortRect: v stz fSkip *** pha ~RectInRgn #myRect,visHandle pla bne doit * brl l4 skip this line segment inc fSkip ** * end new stuff ************************ ACTUAL CONTENT DRAW ROUTINE ******************* doit ~SetPenSize sPenSize+2,sPenSize lda sCMD bne l7 brl exit l7 cmp #6 bcs l1 asl a tax lda fSkip *** bne l4 *** jsr (toolTable,x) brl l4 l1 cmp #11 bcs l2 bra exit l2 cmp #17 bcc l3 bra exit l3 sec sbc #11 asl a tax lda fSkip *** bne l4 *** jsr (toolTable2,x) l4 move4 sLink,theData lda theData ora theData+2 beq exit brl loop exit anop lda theWindow *** TEST... ldx theWindow+2 jsr GrowClip *** TEST ... lda rts ************************** MINI FILE INFO: 52 BYTES *************************** theData ds 4 Handle to linked segment list theText ds 4 Handle to linked AtomText list theObj ds 4 Handle to linked object list hScroll ds 4 handle to hor. scroll bar (ID 5) vScroll ds 4 handle to vert. scroll bar (ID 6) Mountn ds 4 handle to display size control (ID 8) SizeBox ds 4 handle to size box control (ID 9) contRect entry dc i2'18,0,156,531' Window's Content Rect (own terminology) pixImage ds 4 xOffset ds 2 x offset into document yOffset ds 2 y " " " docW ds 2 docH ds 2 ******************************************************************************* srcRect dc i2'0,0,200,640' muss noch automatisiert werden * evt sogar into mini file info!!! theWindow ds 4 theHandle ds 4 visHandle ds 4 myRect ds 8 dPortRect entry ds 8 fSkip dc i2'0' * toolBar ds 4 *btnRect entry destRect dc i2'0,0,17,640' myX entry ds 2 \ most recent -18,0,-1,550 myY entry ds 2 winH entry ds 2 winW entry ds 2 myPtr ds 4 fWindow ds 4 vScrollBar anop dc i2'10' pCount dc i4'6' ID vsRect dc i2'17,532,158,558' rect dc i4'$86000000' ScrollBar defProc dc i2'3' flag dc i2'$1002' moreFlags dc i4'0' refCon dc i2'0' maxSize dc i2'50' viewSize dc i2'0' initialValue dc i4'0' colorTableRef hScrollBar anop dc i2'10' pCount dc i4'5' ID hsRect dc i2'157,104,170,534' rect dc i4'$86000000' ScrollBar defProc dc i2'$1C' flag dc i2'$1002' moreFlags dc i4'0' refCon dc i2'0' maxSize dc i2'50' viewSize dc i2'0' initialValue dc i4'0' colorTableRef end ************************ CLIP REGION MANIPULATING SUBROUTINES ************ shrinkClip start using Globals sta parmWin parameter: AX=windowPtr stx parmWin+2 ph4 #0 ~GetPort pl4 theWindow ~SetPort parmWin ~GetPortRect #portRect lda portRect+6 Stuff to position the ctls... sec sbc portRect+2 sta winW lda portRect+4 sec sbc portRect sta winH sec winH still in A-reg lda winH sbc #11 heigth of size box -1 sta myY lda winW sec sbc #24 width of size box -2 sta myX lda myY dec a sta contRect+4 lda myX sta contRect+6 ph4 #0 ~NewRgn pl4 theRgn ~rectRgn theRgn,#contRect ~SetClip theRgn ~SetPort theWindow rts theWindow ds 4 parmWin ds 4 portRect ds 8 theRgn ds 4 contRect anop topLeft dc i2'18,0' myY ds 2 myX ds 2 winH ds 2 winW ds 2 end GrowClip start using Globals sta parmWin parameter: AX=windowPtr stx parmWin+2 ph4 #0 ~GetPort pl4 theWindow ~SetPort parmWin ~GetPortRect #portRect ph4 #0 ~NewRgn pl4 theRgn ~rectRgn theRgn,#portRect ~SetClip theRgn ~SetPort theWindow rts theWindow ds 4 parmWin ds 4 theRgn ds 4 portRect ds 8 end \ No newline at end of file diff --git a/equates.asm b/equates.asm new file mode 100644 index 0000000..4ae0015 --- /dev/null +++ b/equates.asm @@ -0,0 +1 @@ +**************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * GLOBAL EQUATES **************************************************************** * * INCLUDE ... * copy 13:Ainclude:E16.CONTROL copy 13:Ainclude:E16.DIALOG copy 13:Ainclude:E16.EVENT copy 13:Ainclude:E16.MEMORY copy 13:Ainclude:E16.MISCTOOL copy 13:Ainclude:E16.QDAUX copy 13:Ainclude:E16.QUICKDRAW copy 13:Ainclude:E16.RESOURCES copy 13:Ainclude:E16.SCRAP copy 13:Ainclude:E16.TYPES copy 13:Ainclude:E16.WINDOW copy 13:Ainclude:E16.PRINT copy 13:Ainclude:E16.MENU copy 13:Ainclude:E16.STDFILE **************************************************************** * * CONST * kTools gequ 1 Resource IDs kMBarID gequ 1 kAboutWID gequ $FFA kDataWID gequ $FF9 kToolWID gequ $FF8 kEasterWID gequ $FF7 kPrefWID gequ $FF6 kHelpWID gequ $FF5 kAlertRO gequ 1 kSaveChID gequ 2 kRevertID gequ 3 kToolPicID gequ 2 kButtonBarID gequ 3 formerly 5... kChFontID gequ 1 kPicResID gequ $8002 rCursor gequ $8027 rFont gequ $C003 ptr GEQU 4 invalidAccess gequ $4E kAppleM gequ 1 Apple Menu IDs kFileM gequ 2 File Menu IDs kEditM gequ 3 Edit Menu IDs TextToolID gequ 12 TEditID gequ 20 Line Edit Cntl ID (In fact it's a TEdit) hScrlID gequ 5 hor. scroll bar ID vScrlID gequ 6 vert. scroll bar ID MountnID gequ 8 display size control ID SizeBxID gequ 9 size box control ID TBarCID gequ 7 inactive ToolBar ctl ID kDataWidth gequ 640 kDataHeigth gequ 400 kWInfoSize gequ 6 Window Information Block segSize GEQU 32 FInfoSize gequ 116 used in GLOBALS, WINDOWS, FILE miniFInfo gequ 56 used in DRAW, see also GLOBALS kRulerH gequ 18 \ No newline at end of file diff --git a/file.asm b/file.asm new file mode 100644 index 0000000..a6de0c2 --- /dev/null +++ b/file.asm @@ -0,0 +1 @@ + keep FILE **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module FILE **************************************************************** * * USES ... * mcopy File.macros copy equates.asm **************************************************************** * * File Stuff * OpenDlog start using Globals using Parms ~SFGetFile2 #120,#40,#RefIsPointer,#prompt,#0,#typeList,#gReplyRec lda gReplyRec rts prompt dw 'Open Chemix File:' typeList dc i2'1' numEntries dc i2'$8000' flags cf.p. 48-10 TB III dc i2'$00F4' fileType dc i4'$00005548' auxType; ='UH' end DoOpen start using Globals using Parms jsr OpenDlog bne l1 user cancelled the open dlog brl exit l1 anop lda gRRpath ldx gRRPath+2 jsr Deref sta Opath stx Opath+2 ~HUnlock gRRpath inc4 Opath convert Cl1output to Cl1InputString inc4 Opath Open2 entry inc fFullAccess assume full R/W access allowed lda #3 try R/W access sta OreqAcc OpenGS OpenParm bcc opened no Error --> OK sta gToolErr stz fFullAccess sorry, no full R/W access... cmp #invalidAccess (R/O) bne exit2 jsr alertRO inform user of read only access beq exit User cancelled OPEN lda #1 try read only sta OreqAcc OpenGS OpenParm sta gToolErr bcs exit2 opened anop ~WaitCursor lda OpenParm+2 sta CloseParm+2 sta ReadParm+2 sta RSegRec+2 jsr DoNew2 jsr OpenWindow inc gDataWNum jsr NewData lda OpenParm+2 ... * sta gRefNum besser hier... * jsr ReadFile bcs exit4 close window if READ fails lda fFirstFile bne l2 jsr NewTitle l2 stz fFirstFile inc fSaved inc fNamed lda fFullAccess beq exit3 brl exit exit4 jsr DoClose bra exit2 exit3 CloseGS CloseParm close if R/O exit2 jsr Error exit ~InitCursor rts alertRO anop inform user that file is read only pha ~AlertWindow #4,#0,#kAlertRO refIsResource,no SubstStrings,ResID pla rts NewTitle entry inc fNamed set 'named' flag move4 gRRname,gTitleH lda gTitleH ldx gTitleH+2 jsr Deref sta 0 stx 2 ldy #2 Convert Cl2 Output to... lda [0],y xba sta [0],y move4 0,gTitlePtr inc4 gTitlePtr inc4 gTitlePtr inc4 gTitlePtr ...Pascal string ~SetWTitle gTitlePtr,gDataWin rts end ReadFile start using Globals using Parms move4 #FileHeader,RdBuf ReadGS ReadParm sta gToolErr bcs rdExit jsr ReadData rdExit rts check for errors in calling pgm only ReadData anop ph4 #0 ~NewHandle #segSize,gMyID,#0,#0 pl4 gNewLink ReadGS RSegRec sta gToolErr bcs exit lda sLink ora sLink+2 beq exit move4 gNewLink,sLink ~PtrToHand #TheSegment,gLink,#segSize * move4 gNewLink,gLink bra ReadData exit brl exit3 lda fCacheWins bne drawOff brl exit3 ******************* NEW: DRAW INTO OFFSCREEN PORT *********************** drawOff ~PtrToHand #TheSegment,gLink,#4 **** ph4 #0 ~GetPort pl4 thePort ph4 #0 ~GetWRefCon gDataWin pl4 theHandle ~HandToPtr theHandle,#theData,#40 ~SetPort offPort loop ~HandToPtr theData,#TheSegment,#segSize ~SetPenSize sPenSize+2,sPenSize lda sCMD bne l7 brl exit2 l7 cmp #6 bcs l1 asl a tax jsr (toolTable,x) brl l4 l1 cmp #11 bcs l2 bra exit2 l2 cmp #17 bcc l3 bra exit2 l3 sec sbc #11 asl a tax jsr (toolTable2,x) l4 move4 sLink,theData lda theData ora theData+2 beq exit2 brl loop exit2 anop ~SetPort thePort exit3 rts theData ds 4 Handle to linked segment list theText ds 4 Handle to linked AtomText list theObj ds 4 Handle to linked object list ds 4 handle to hor. scroll bar (ID 5) ds 4 handle to vert. scroll bar (ID 6) ds 4 handle to display size control (ID 8) ds 4 handle to size box control (ID 9) dc i2'18,0,156,531' Window's Content Rect (own terminology) offPort ds 4 theWindow ds 4 thePort ds 4 theHandle ds 4 end DoNew start using Globals ph4 #0 create Title string ~NewHandle #12,gmyID,#0,#0 pl4 gTitleH lda gTitleH ldx gTitleH+2 jsr Deref sta gTitlePtr stx gTitlePtr+2 ~Int2Hex fileCount,#winTitle+10,#2 ~BlockMove #winTitle,gTitlePtr,#12 jsr doNew2 jsr OpenWindow sed increment file count... clc lda fileCount adc #1 sta fileCount cld in decimal mode! **** initialize new FileInfo Record **** inc fSaved set 'saved' flag jsr NewData inc gDataWNum stz fNamed clear 'named' flag rts doNew2 entry lda gDataWNum if no window there... beq l1 don't save its File Info! ph4 #0 ~GetWRefCon gDataWin pl4 theHandle ~PtrToHand #FileInfo,theHandle,#FInfoSize l1 rts NewData entry ph4 #0 ~NewHandle #segSize,gMyID,#0,#0 ;Create Link to first data item pl4 gLink move4 gLink,gTheData ~PtrToHand #NewSegment,gLink,#segSize ph4 #0 ~NewHandle #FInfoSize,gmyID,#0,#0 pl4 theHandle ~PtrToHand #FileInfo,theHandle,#FInfoSize ~SetWRefCon theHandle,gDataWin ph4 #0 ~NewHandle #8,gMyID,#0,#0 ;Create Link to first text item pl4 gTXLink move4 gTXLink,gTheText ~PtrToHand #NewText,gTXLink,#8 ;8=Size of empty text item ph4 #0 ~NewHandle #8,gMyID,#0,#0 ;Create Link to first object pl4 gObjLink move4 gObjLink,gTheObj ~PtrToHand #NewObj,gObjLink,#8 ;8=size of empty object rts theHandle ds 4 fileCount dc i2'1' winTitle dw 'Untitled.xx' number at titlePtr+10 end DoClose start using Globals using Parms inc answer ??? ph4 #0 ~FrontWindow pl4 theWindow lda theWindow ora theWindow+2 bne l3 sec brl exit l3 cmp4 theWindow,gToolWin bne l4 brl exit l4 pha ~GetWKind theWindow pla bne l1 lda fSaved bne l2 jsr AskClose sta answer beq exit cmp #1 beq l2 jsr DoSave beq exit don't close if 'save' is cancelled l2 ~CloseWindow theWindow ~DisposeHandle PicHandle **** hier richtig??? dec gDataWNum *** New Stuff lda fNamed beq exit lda gRefNum sta CloseParm+2 CloseGS CloseParm *** End new Stuff bra exit l1 ~CloseNDAByWinPtr theWindow exit jsr AdjustCursor *** lda answer rts theWindow ds 4 answer ds 2 AskClose entry ask 'Save Changes?' ~InitCursor *** new pha ~AlertWindow #4,#0,#kSaveChID refIsResource,no SubstStrings,ResID pla rts end DoRevert start using Globals using Parms rts end DoSave start using Globals using Parms lda fNamed bne sOK jsr DoSaveAs brl sExit sOK anop * get pathname from fileInfo WriteFile entry lda wKind sta fileKind ~HandToPtr gPrintHndl,gPrintRec,#140 lda gRefNum sta setEOFRec+2 sta writeRec+2 sta WSegRec+2 sta flushRec+2 SetEOFGS setEOFRec sta gToolErr jsr Error WriteGS writeRec Write the header... sta gToolErr jsr Error jsr WriteData ...and the data FlushGS flushRec sta gToolErr jsr Error inc fSaved sExit rts WriteData anop move4 gTheData,theData loop anop ~HandToPtr theData,#TheSegment,#segSize sta gToolErr bcs Exit WriteGS WSegRec sta gToolErr bcs exit move4 sLink,theData lda theData ora theData+2 beq exit brl loop exit jsr Error rts theData ds 4 *theHandle ds 4 DoSaveAs entry ph4 #0 ~GetWTitle gDataWin pl4 gTitlePtr lda gTitlePtr convert Pascal string from Window ldx gTitlePtr+2 title into a GS/OS C1inputString sta 0 stx 2 lda [0] and #$FF inc a sta origLen ~BlockMove gTitlePtr,#origName+1,origLen lda origLen dec a sta origName ~SFPutFile2 #120,#40,#RefIsPointer,#svPrompt,#RefIsPointer,#origName,#gReplyRec lda gReplyRec bne svOK brl svExit svOK anop ~WaitCursor * Code for saving file lda fNamed If file not named... beq notOpen ...it's not open, so skip dec4 gPathPtr get Handle for current pathname... dec4 gPathPtr ph4 #0 ~FindHandle gPathPtr pl4 theHandle ~DisposeHandle theHandle ...and get rid of it lda gRefNum Close old file sta CloseParm+2 CloseGS CloseParm sta gToolErr ***test jsr Error ***test notOpen anop lda gRRPath get new Pathname Handle ldx gRRPath+2 deref it, and... jsr Deref sta gPathPtr stx gPathPtr+2 inc4 gPathPtr ...convert to Cl1InputString inc4 gPathPtr move4 gPathPtr,destroyRec+2 DestroyGS destroyRec delete old version on disk... sta gToolErr bcc desOK cmp #$10 devNotFound beq desOK cmp #$46 fileNotFound beq desOK jsr Error brl svExit desOK anop move4 destroyRec+2,createRec+2 gPathPtr,createRec+2 CreateGS createRec sta gToolErr jsr Error move4 gPathPtr,Opath lda #3 R/W access sta OreqAcc OpenGS OpenParm sta gToolErr jsr Error lda OpenParm+2 sta gRefNum jsr WriteFile ~DisposeHandle gTitleH get rid of old title handle jsr NewTitle get new title from replyRec brl svExit * inc fNamed set 'named' flag * ~DisposeHandle gTitleH get rid of old title handle * move4 gRRname,gTitleH * lda gTitleH * ldx gTitleH+2 * jsr Deref * sta 0 * stx 2 * ldy #2 Convert Cl2 Output to... * lda [0],y * xba * sta [0],y * move4 0,gTitlePtr * inc4 gTitlePtr * inc4 gTitlePtr * inc4 gTitlePtr ...Pascal string * ~SetWTitle gTitlePtr,gDataWin svExit ~InitCursor lda gReplyRec return status of PutFile dialog rts svPrompt dw 'Save Chemix File As:' origLen ds 4 origName ds 257 theHandle ds 4 end DoQuit start using Globals l1 jsr DoClose beq exit bcs l2 ph4 #0 ~FrontWindow pl4 theWindow ph4 #0 ~GetWRefCon theWindow pl4 theHandle ~HandToPtr theHandle,#FileInfo,#FInfoSize brl l1 l2 dec gDone exit rts theWindow ds 4 theHandle ds 4 end Parms data using Globals gReplyRec ds 8 dc i2'3' nameRefDesc=RefIsNewHandle gRRname ds 4 dc i2'3' pathRefDesc=RefIsNewHandle gRRpath ds 4 handle to Cl1OutputString (w Buffer size) OpenParm dc i2'3' pCount ds 2 refNum Opath ds 4 pathname pointer OreqAcc dc i2'3' requestAccess ds 2 resourceNumber ds 2 access ds 2 fileType ds 4 auxType ds 2 storageType ds 8 createDateTime ds 8 modDateTime ds 4 optionList Oeof ds 4 eof ds 4 blocksUsed ds 4 resourceEOF ds 4 resourceBlocks ReadParm dc i2'4' pCount ds 2 refNum RdBuf dc i4'FileHeader' dataBuffer RrCount dc i4'256' requestCount ds 4 transferCount ds 2 cachePriority RSegRec dc i2'4' pCount ds 2 refNum dc i4'TheSegment' dataBuffer dc i4'SegSize' requestCount ds 4 transferCount ds 2 cachePriority writeRec dc i2'4' ds 2 refNum dc i4'FileHeader' dataBuffer dc i4'256' requestCount; current header size ds 4 transferCount ds 2 cachePriority; not used wSegRec dc i2'4' ds 2 refNum dc i4'TheSegment' dataBuffer dc i4'SegSize' requestCount; current seg size ds 4 transferCount ds 2 cachePriority; not used flushRec dc i2'1' ds 2 refnum CloseParm dc i2'1' ds 2 refNum destroyRec dc i2'1' ds 4 createRec dc i2'4' ds 4 pathName dc i2'$00C3' access dc i2'$00F4' fileType dc i4'$00005548' auxType; 'UH' ds 2 storageType ds 4 eof ds 4 resourceEOF setEOFRec dc i2'3' ds 2 refNum dc i2'0' base; set EOF to displacement dc i4'0' displacement war 1***** end \ No newline at end of file diff --git a/gen b/gen new file mode 100644 index 0000000..c3e4a79 --- /dev/null +++ b/gen @@ -0,0 +1 @@ +cd /ae2/genesys genesys \ No newline at end of file diff --git a/globals.asm b/globals.asm new file mode 100644 index 0000000..7e0f43d --- /dev/null +++ b/globals.asm @@ -0,0 +1 @@ + keep GLOBALS **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module GLOBALS **************************************************************** * * USES ... * mcopy Globals.macros copy equates.asm **************************************************************** * * VAR * Globals data gMemID ds 2 gMyID ds 2 gToolRef ds 4 fDoAbout ds 2 fWaitForKey ds 2 fTextFlag ds 2 gMainEvt ds 16 Task Record: Event+Task (Fields by Offs) gTaskDta ds 4 gTaskMsk dc i4'$001FFB7F' @@@@ was $001FFF7F ds 4 wmLastClickTick ds 2 wmClickCount gTaskDa2 ds 4 gTaskDa3 ds 4 gTaskDa4 ds 4 ds 4 wmLastClickPt ds 2 dummy (rest of Task record ?) gDone dc i2'0' Quit flag gToolID ds 2 active tool from toolbar oldToolID ds 2 gToolErr ds 2 gDataWNum ds 2 gDefaultTool dc i2'2' Single bond tool gAboutWin ds 4 gLastWindow ds 4 gVersion dc i2'2' TBOffset dc i2'6' RulerH dc i2'18' ruler heigth SGRecord ds 14 generic Set/GetField Record gNewLink ds 4 gNewText ds 4 gNewObj ds 4 gToolWin ds 4 gEasterWin ds 4 gPrefWin ds 4 gHelpWin ds 4 gEditCursor ds 4 Pointer to Edit Cursor (1 of the following) gCrossCur ds 4 Handle gMarqueeCur ds 4 Handle gHandCur ds 4 Handle gTextCur ds 4 Handle gEraseCur ds 4 Handle gArrowCur ds 4 ChFont ds 4 SysFont ds 4 LErecH ds 4 masterSCB ds 2 fFirstFile ds 2 fCacheWins dc i2'0' Set Cache Windows to FALSE fSys5 dc i2'0' 1 -> TRUE; $8001 -> DON'T CHANGE gPenSize dc i2'1' dc i2'2' FInfoHndl ds 4 Handle to window's File Info Record *+++++++++++++++++++++ FILE INFO RECORD +++++++++++++++++++++++++++++++++++++++ FileInfo anop (100 Bytes for each file) gTheData ds 4 Handle to linked segment list gTheText ds 4 Handle to linked AtomText list gTheObj ds 4 Handle to linked object list hScrollH ds 4 handle to hor. scroll bar (ID 5) vScrollH ds 4 handle to vert. scroll bar (ID 6) MountnH ds 4 handle to display size control (ID 8) SizeBoxH ds 4 handle to size box control (ID 9) gContentRect dc i2'18,0,156,531' Window's Content Rect (own terminology) gOffPort ds 4 Pointer to Window's offscreen GrafPort! gXoffset ds 2 gYoffset ds 2 gDocW ds 2 gDocH ds 2 LEditH ds 4 handle to window's Line Edit Cntl (ID 4) TBarH ds 4 Handle to inactive ToolBar Ctrl (ID 7) *\----------------This part moved on every update---56 Bytes-------------------/ gLink ds 4 Handle to next free segment gTXLink ds 4 Handle to next free AtomText string gObjLink ds 4 Handle to next free object space gDataWin ds 4 Pointer to current Window's GrafPort wKind ds 2 Kind of Window -- unused yet fSaved dc i2'1' set to TRUE, so no 'Save' of empty Win fNamed ds 2 Is set to TRUE after a PutFile Dialog fFullAccess ds 2 TRUE if R/W access to file fOpened ds 2 TRUE if file associated to Window is open gTitleH ds 4 Handle to Title memory Block (for resizing, etc.) gTitlePtr ds 4 Pointer to title string gPrintHndl ds 4 Handle to Window's Print Record gPathPtr ds 4 Pointer to Window's file path gRefNum ds 2 File Reference Number of Window's associated File gInfoRect ds 8 Window's Info Bar Rectangle picHandle ds 4 Handle to offscreen picture! ds 4 dummy *++++++++++++++++++ END of FileInfo RECORD ++++++++++++++++++++++++++++++++++++ dumdum ds 10 nothin' FileHeader anop *----------H-E-A-D-E-R----------------* hdrLength dc i4'256' hdrVersion dc h'0001' fileKind ds 2 gPrintRec ds 140 *** Insert additional header data here *** hdrDummy ds 120 *-------E-N-D---O-F---H-E-A-D-E-R-----* locInfo anop portSCB ds 2 SCB Byte ptrToPixImage ds 4 pointer to pixel image width dc i2'160' width boundsRect dc i2'0,0,400,640' boundary rectangle NewSegment anop empty segment data for newLink ds 32 TheSegment anop sLink ds 4 actual data segment sType ds 2 sRgnHndl ds 4 sSize ds 2 sNamePtr ds 4 sColor ds 2 sPenSize ds 4 sCMD ds 2 yy ds 2 point 1 ('grided' coordinates) xx ds 2 yy2 ds 2 point 2 ('grided' coordinates) xx2 ds 2 NewText ds 8 New empty text element TheText anop Actual Text element txLink ds 4 Link to the next text element txPoint ds 4 Coordinates, where text appears txLen ds 1 Length of following text string txString ds 256 Actual text string NewObj ds 8 New empty object TheObj anop Actual object objLink ds 4 Link to next object objPoint ds 4 Coordinates, where object appears objData ds 256 Actual object data gForePat ds 32 gBackPat ds 32 teRec ds $107 outH ds 4 Handle to Key Filter Output *************** TEMPORARY SPACE FOR WINDOW DRAW ROUTINES **************** gViewW ds 2 gViewH ds 2 end *********************** INITIALIZE GLOBALS ****************************** InitGlobals start using Globals jsr SetTheFont ph4 #0 ~NewWindow2 #0,#0,#0,#0,#RefIsResource,#kAboutWID,#rWindParam1 pl4 gAboutWin lda #1 sta fWaitForKey fWaitForKey:=TRUE (About Box) stz gDone QuitFlag:=FALSE stz fSys5 System 5:=FALSE ph2 #0 ~GetMasterSCB pl2 masterSCB pha test Sys version via QD version ~QDVersion pla and #$0FFF mask off special flags cmp #$0307 Sys6's QD version bcs sys6 it IS Sys 6!!! lda #$8001 set sys5 flag (pre-sys6) sta fSys5 ('don't change') sys6 anop ph4 #0 Load Cursors into memory ~LoadResource #rCursor,#1 .. Cross tool pla plx jsr Deref sta gCrossCur stx gCrossCur+2 ph4 #0 ~LoadResource #rCursor,#2 .. Marquee cursor pla plx jsr Deref sta gMarqueeCur stx gMarqueeCur+2 ph4 #0 ~LoadResource #rCursor,#3 .. Hand cursor pla plx jsr Deref sta gHandCur stx ghandCur+2 ph4 #0 ~LoadResource #rCursor,#4 .. Text Cursor pla plx jsr Deref sta gTextCur stx gTextCur+2 ph4 #0 ~LoadResource #rCursor,#5 .. Cut cursor pla plx jsr Deref sta gEraseCur stx gEraseCur+2 ph4 #0 ~LoadResource #rCursor,#6 .. Arrow cursor pla plx jsr Deref sta gArrowCur stx gArrowCur+2 lda gDefaultTool initialize Tool on startup sta gToolID jsr doTheTool rts ph4 #0 create keyfilter I/O Handle ~NewHandle #2,gMyID,#0,#0 pl4 outH end SetTheFont start using Globals ph4 #0 ~LoadResource #rFont,#kChFontID sta gToolErr pl4 ChFont jsr Error ~AddFamily FontID,#FontName sta gToolErr jsr Error ~AddFontVar ChFont,#$002D sta gToolErr jsr Error ~FMSetsysFont FontID sta gToolErr jsr Error rts FontName dw 'Chemix' FontID dc i2'$FFFD' ** vielleicht zu verbessern... dc i1'0' style dc i1'8' size end Version data gCopyLoc dc i2'20,89' dc i2'75,98' CopyRight dw '(c) 1992 Bright Software, Switzerland' VersionStr dw ' Internal release 0.2.1 ' ;' Demo Release 0.03b' end **************************************************************************** * Data Format * * * **************************************************************************** * Single Segment * * * * 4 6 10 12 16 18 22 24 28 32 * +---------+----+---------+----+---------+----+--------+----+--------+--------+ * | link |type| rgnHndl |size| namePtr |col | psize |cmd | p1 | p2 | * +---------+----+---------+----+---------+----+--------+----+--------+--------+ * * **************************************************************************** * Object * * * * 4 6 10 12 16 * * +---------+----+---------+----+---------+ * * | link |type| rgnHndl |size| namePtr | * * +---------+----+---------+----+---------+ * * * * 2 6 8 12 16 * +----+--------+----+--------+--------+ * Line 1 |col | pSize |cmd | p1 | p2 | * +----+--------+----+--------+--------+ * Line 2 |col | pSize |cmd | p1 | p2 | * +----+--------+----+--------+--------+ * etc... * **************************************************************************** \ No newline at end of file diff --git a/main.asm b/main.asm new file mode 100644 index 0000000..3f0cec1 --- /dev/null +++ b/main.asm @@ -0,0 +1 @@ + keep Main **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module MAIN **************************************************************** * * USES ... * mcopy Main.macros copy equates.asm **************************************************************** * * MAIN ROUTINE * Main start using Globals phk plb ~TLStartup pha gMemID:=MMStartup; ~MMstartup pla sta gMemID ora #$0100 sta gMyID make private ID for all mem requests lda #1 sta fDoAbout jsr Hello pha gToolRef:=StartupTools(... pha ~StartupTools gMemID,#RefIsResource,#kTools sta gToolErr pl4 gToolRef lda gToolErr bne exit Shutdown on Tool Startup Error jsr InitGlobals lda fDoAbout beq noAbout jsr ShowAbout noAbout anop jsr SetUpMenus jsr SetUpWindows jsr HideAbout jsr FirstFile ~InitCursor jsr EventLoop exit ~DisposeAll gMyID ~ShutDownTools #RefIsHandle,gToolRef ~MMShutDown gMemID ~TLShutDown QuitGS quitParm quitParm ds 8 end FirstFile start using Globals using Parms ph4 #0 ~NewHandle #1,gMyID,#0,#0 pl4 messaHandle ~MessageCenter #2,#1,messaHandle get Message from Finder bcc l4 brl l1 ...no message found... l4 anop lda messaHandle ldx messaHandle+2 jsr Deref sta messaPtr stx messaPtr+2 move4 messaPtr,0 add4 0,#6 lda [0] sta message cmp #2 bcc l3 brl l2 >= 2 NO VALID MESSAGE! l3 anop inc4 0 put pointer one byte before path str * brk lda [0] ...and convert it to a Cl1 input string xba and #$00FF sta [0] sta pathLen move4 0,Opath ldy pathLen load path str length into y add4 0,#1 0 points 1 byt before 1st ch in path str loop lda [0],y and #$00FF cmp #'/' beq match cmp #':' beq match dbne y,loop match sty temp sub2 pathLen,temp,nameLen add4 0,temp dec4 0 lda nameLen * xba sta nameLen2 inc4 0 inc4 nameLen ph4 #0 ~NewHandle nameLen,gMyID,#0,#0 pl4 gTitleH ~PtrToHand 0,gTitleH,nameLen ~PtrToHand #nameLen2,gTitleH,#1 lda gTitleH ldx gTitleH+2 jsr Deref sta gTitlePtr stx gTitlePtr+2 inc fFirstFile jsr Open2 lda message cmp #1 bne l2 jsr DoPrint l2 ~MessageCenter #3,#1,messaHandle delete the Message ~DisposeHandle messaHandle bra exit l1 jsr DoNew exit rts messaHandle ds 4 thePtr ds 4 messaPtr ds 4 message ds 2 nameLen ds 4 pathLen ds 4 temp ds 4 nameLen2 ds 2 end **************************************************************** * * General Subroutines Error start if there is a Tool error, display it using Globals php lda gToolErr beq exit ~SysBeep ph2 #0 ~ErrorWindow #1,#0,gToolErr pl2 dummy exit lda gToolErr plp rts dummy ds 2 end SetUpMenus start using Globals ph4 #0 ~NewMenuBar2 #RefIsResource,#kMBarID,#0 pl4 myBar ~SetsysBar myBar ~SetMenuBar #0 ~FixAppleMenu #kAppleM pha ~FixMenuBar pl2 heigth ~DrawMenuBar rts heigth ds 2 myBar ds 4 end END of SetUPMenus EventLoop start using Globals stz gDone evloop jsr CheckFrontW pha ~TaskMaster #everyEvent,#gMainEvt pl2 code lda code cmp #wInGoAway bne l2 jsr DoClose brl exit l2 cmp #wInMenuBar bne l1 jsr HandleMenu brl exit l1 cmp #wInSpecial bne l3 jsr HandleMenu brl exit ???// l3 anop *** new stuff cmp #wInContent bne l4 jsr HandleContent in module WINDOWS brl exit ???// l4 cmp #wInInfo bne exit jsr HandleInfo in module WINDOWS exit lda gDone bne exit2 lda gTaskDta see whether Tool win needs redrawing and #$7FFF cmp #wInGrow beq doUpD @@@@@@@@ cmp #wInDrag beq doUpD cmp #wInZoom beq doUpD cmp #wClickCalled beq doUpD * Insert Null Event Handler Here... jsr HndlDiskInsert bra loop doUpD jsr UpdateToolWin loop anop jsr AdjustCursor jmp evloop exit2 rts code ds 2 end CheckFrontW start using Globals ph4 #0 ~FrontWindow pl4 theWindow lda theWindow same window as last time? cmp gLastWindow bne changed lda theWindow+2 cmp gLastWindow+2 bne changed exit1 rts changed anop stz newCursor jsr UpdateToolWin lda theWindow Window has changed, but... ora theWindow+2 bne l4 brl l1 ...no Window at all! l4 pha is it a DA? ~GetSysWFlag theWindow pla beq noDA no DA, so skip ~EnableMItem #255 It's a DA! (enable Close Item) ~SetMenuFlag #$FF7F,#3 enable Edit Menu ~DrawMenuBar brl exit noDA anop lda theWindow cmp gToolWin bne l2 lda theWindow+2 cmp gToolWin+2 bne l2 bra l1 l2 jsr enableItems move4 theWindow,gTaskDta *** is it secure enough?...*** jsr SelDataWin bra exit l1 anop no Window there... jsr disableItems exit move4 theWindow,glastWindow rts enableItems anop lda fEnabled already enabled? bne en1 yes, so skip ~EnableMItem #255 Close ~EnableMItem #260 Save ~EnableMItem #261 Save As ~EnableMItem #262 Revert ~EnableMItem #263 Page Setup ~EnableMItem #264 Print ~SetMenuFlag #enableMenu,#3 Edit Menu ~DrawMenuBar inc fEnabled set 'fEnabled' flag en1 rts disableItems anop stz fEnabled ~DisableMItem #255 Close ~DisableMItem #260 Save ~DisableMItem #261 Save As ~DisableMItem #262 Revert ~DisableMItem #263 Page Setup ~DisableMItem #264 Print ~SetMenuFlag #disableMenu,#3 Edit Menu ~DrawMenuBar rts theWindow ds 4 theHandle ds 4 fEnabled ds 2 Flag, TRUE if Items enabled end Ignore start rts end Deref start Derefs and locks handle passed in sta 0 a,x. Result passed back in a,x stx 2 trashes 0 on DP ldy #4 lda [0],y sta lockState ora #$8000 sta [0],y dey dey lda [0],y tax lda [0] rts Unlock entry Unlocks the handle passed in x,a sta 0 trases 0 on DP stx 2 ldy #4 lda lockState better?... * lda [0],y * and #$7FFF sta [0],y rts lockState ds 2 end GetField start sta 0 stx 2 ldy #0 loop lda [0],y copy input SGRecord into local area sta handle,y iny iny cpy #14 length of the SGRecord bcc loop lda offset clc adc length sta endf _Deref handle,0 move4 destptr,4 sub4 4,offset ldy offset loop2 lda [0],y sta [4],y iny iny cpy endf bcc loop2 _Unlock handle rts handle ds 4 offset ds 4 destptr ds 4 length ds 2 endf ds 2 end SetField start sta 0 stx 2 ldy #0 loop lda [0],y copy input SGRecord into local area sta handle,y iny iny cpy #14 length of the SGRecord bcc loop lda offset clc adc length sta endf _Deref handle,4 trashes 0,1!!!!!!!! move4 sourceptr,0 sub4 0,offset ldy offset loop2 lda [0],y sta [4],y iny iny cpy endf bcc loop2 _Unlock handle rts handle ds 4 offset ds 4 sourceptr ds 4 length ds 2 endf ds 2 end Test start ~SysBeep rts end SetUpWindows start using Globals ph4 #0 Set Up Tool Window ~NewWindow2 #0,#0,#0,#0,#RefIsResource,#kToolWID,#rWindParam1 pl4 gToolWin ~SetContentDraw #DrawToolWin,gToolWin ph4 #0 ~NewWindow2 #0,#0,#0,#0,#RefIsResource,#kEasterWID,#rWindParam1 pl4 gEasterWin ph4 #0 ~NewWindow2 #0,#0,#0,#0,#RefIsResource,#kPrefWID,#rWindParam1 pl4 gPrefWin ph4 #0 ~NewWindow2 #0,#0,#0,#0,#RefIsResource,#kHelpWID,#rWindParam1 pl4 gHelpWin rts end **** Altes DoAbout *************************** * ~SetForeColor #3 white * ~SetBackColor #0 black * ~SetTextMode #modeCopy ** ~MoveTo gCopyLoc,gCopyLoc+2 ** ~DrawString #Copyright ** ~MoveTo gCopyLoc+4,gCopyLoc+6 ** ~DrawString #VersionStr ********************************************** ShowAbout start using Globals stz fWaitForKey DoAbout entry ph4 #0 ~FrontWindow pl4 theWindow ~SendBehind #-1,gAboutWin * ~ShowHide #1,gAboutWin ~ShowWindow gAboutWin ~SelectWindow gAboutWin ~BeginUpdate gAboutWin ~DrawControls gAboutWin ~EndUpdate gAboutWin lda fWaitForKey beq noWait loop pha ~GetNextEvent #$A,#eventRec MouseDown, KeyDown pla beq loop HideAbout entry ~ShowHide #0,gAboutWin ~SelectWindow theWindow noWait anop lda #1 sta fWaitForKey set again the flag for next call rts theWindow ds 4 eventRec ds 16 end DoPrefs start *** do sth more... using Globals ph4 #0 ~FrontWindow pl4 theWindow ~SendBehind #-1,gPrefWin ~ShowHide #1,gPrefWin ~SelectWindow gPrefWin ~BeginUpdate gPrefWin ~DrawControls gPrefWin ~EndUpdate gPrefWin loop pha ~GetNextEvent #$A,#eventRec MouseDown, KeyDown pla beq loop ~ShowHide #0,gPrefWin ~SelectWindow theWindow rts theWindow ds 4 eventRec ds 16 end DoHelp start *** do sth more... using Globals ph4 #0 ~FrontWindow pl4 theWindow ~SendBehind #-1,gHelpWin ~ShowHide #1,gHelpWin ~SelectWindow gHelpWin ~BeginUpdate gHelpWin ~DrawControls gHelpWin ~EndUpdate gHelpWin loop pha ~GetNextEvent #$A,#eventRec MouseDown, KeyDown pla beq loop ~ShowHide #0,gHelpWin ~SelectWindow theWindow rts theWindow ds 4 eventRec ds 16 end ForeColor start Generates gForePat from colorNum using Globals colorNum in A and #$F sta temp asl a asl a asl a asl a ora temp sta temp xba hier musst du noch schieben um 4 bit ora temp ldx #0 loop sta forePat,x inx inx cpx #32 bcc loop ~SetPenPat #forePat rts BackColor entry Same for Background Pattern and #$F sta temp asl a asl a asl a asl a ora temp sta temp xba ora temp ldx #0 loop2 sta backPat,x inx inx cpx #32 bcc loop2 ~SetBackPat #backPat rts temp ds 2 forePat ds 32 backPat ds 32 end Hello start using Globals ph4 #0 ~NewHandle #1,gMyID,#0,#0 pl4 messaHandle ~MessageCenter #2,#1,messaHandle get Message from Finder bcs noMessa brl exit noMessa anop OpenGS TOpenParm Load Title Screen bcs exit2 if none -> skip it stz fDoAbout SHORT M lda $E0C034 sta border Save Border Color and #$F0 ora #$9 Set Border Color to Orange sta $E0C034 lda $E0C029 Enable Super Hires ora #$C0 sta $E0C029 LONG M * OpenGS TOpenParm Already opened! lda TOpenParm+2 sta TReadParm+2 sta TCloseParm+2 ReadGS TReadParm * CloseGS TCloseParm Close later (closes attempt also) SHORT M * lda $E0C010 clear Keyboard strobe stz VBLcount clear own VBL counter loop lda $E0C019 bit 7 = 1 if not VBL and #$80 cmp oldVBL beq noVBL inc VBLcount noVBL sta oldVBL lda VBLcount cmp #240 bcc Loop lda border restore Border color sta $E0C034 LONG M ~DisposeHandle messaHandle exit2 CloseGS TCloseParm exit anop rts TOpenParm dc i2'3' pCount ds 2 refNum dc i4'TitleScrn' pathname pointer dc i2'1' requestAccess ds 2 resourceNumber ds 2 access ds 2 fileType ds 4 auxType ds 2 storageType ds 8 createDateTime ds 8 modDateTime ds 4 optionList ds 4 eof ds 4 blocksUsed ds 4 resourceEOF ds 4 resourceBlocks TReadParm dc i2'4' pCount ds 2 refNum RdBuf dc i4'$00E12000' dataBuffer RrCount dc i4'32767' requestCount ds 4 transferCount ds 2 cachePriority TCloseParm dc i2'1' ds 2 refNum TitleScrn DOSIN 'Title.Scrn' border ds 2 messaHandle ds 4 VBLcount ds 2 oldVBL dc i2'$FF' end \ No newline at end of file diff --git a/mak b/mak new file mode 100644 index 0000000..d4a9143 --- /dev/null +++ b/mak @@ -0,0 +1 @@ +set keeptype s16 * copy -c {1}.asm {1}.bak * cp {1}.asm {1}.bak edit {1}.asm macgen {1}.asm {1}.macros 13:Orcainclude:m= assemble +E {1}.asm link main menu globals sys6 windows file print tools xform draw text keep=Chemix filetype Chemix s16 $DB07 \ No newline at end of file diff --git a/menu.asm b/menu.asm new file mode 100644 index 0000000..15afb2a --- /dev/null +++ b/menu.asm @@ -0,0 +1 @@ + keep MENU **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module MENU **************************************************************** * * USES ... * mcopy Menu.macros copy equates.asm **************************************************************** * * SUBROUTINES * HandleMenu start using Globals lda gTaskDta get Menu Item ID sec turn into index by substracting 250 sbc #250 asl a and multiplying by 2 tax jsr (menuTable,x) call the routine ~HiliteMenu #0,gTaskDta+2 hilite the selected menu rts menuTable dc i2'Ignore' Undo (250) dc i2'Ignore' Cut (251) dc i2'Ignore' Copy (252) dc i2'Ignore' Paste (253) dc i2'Ignore' Clear (254) dc i2'DoClose' Close (255) dc i2'DoAbout' About... (256) dc i2'DoQuit' Quit (257) dc i2'DoNew' New (258) dc i2'DoOpen' Open (259) dc i2'DoSave' Save (260) dc i2'DoSaveAs' Save As... (261) dc i2'DoRevert' Revert (262) dc i2'DoPSetup' Page Setup... (263) dc i2'DoPrint' Print... (264) dc i2'Ignore' Select All (265) ??????? dc i2'Ignore' Bring To Front (266) dc i2'Ignore' Choose Font (267) dc i2'Ignore' Show Clipboard (268) dc i2'Ignore' Send To Back (269) dc i2'Ignore' Group (270) dc i2'Ignore' Ungroup (271) dc i2'Ignore' Size (272) dc i2'DoPrefs' Preferences (273) dc i2'Test' Grid (274) dc i2'Test' Select All (275) dc i2'DoHelp' Help (276) dc i2'Test' Test Beep end \ No newline at end of file diff --git a/sys6.asm b/sys6.asm new file mode 100644 index 0000000..05de1cb --- /dev/null +++ b/sys6.asm @@ -0,0 +1 @@ + keep SYS6 **************************************************************** * ChemiGS * **************************************************************** * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module Sys6: System 6 specific calls mcopy Sys6.macros CheckSystem start test for system 6 using Globals clc lda fSys5 beq isSys6 sec pla return to previous caller if sys5 isSys6 anop rts end HndlDiskInsert start jsr CheckSystem pha pha ~HandleDiskInsert #$C000,#0 pla pla rts end *SetMinGrow start * using Globals * jsr CheckSystem * ph4 #0 * ~GetAuxWindInfo gDataWin * sta gToolErr * pl4 WInfoPtr * jsr Error * move4 WInfoPtr,0 * ldy #$14 * lda #68 * sta [0],y * iny * iny * lda #204 * sta [0],y * rts *WInfoPtr ds 4 * end \ No newline at end of file diff --git a/text.asm b/text.asm new file mode 100644 index 0000000..c24bc2c --- /dev/null +++ b/text.asm @@ -0,0 +1 @@ + keep TEXT **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module TEXT **************************************************************** * * USES ... * mcopy text.macros copy equates.asm KeyFilter start using Globals oteH equ 8 Offset to the teH Input Parm otype equ 4 Offset to the type Input Parm phd save current DP tsc tcd switch to DP in stack ldy #0 *** new: save InfoRect into gInfoRect lda #0 *** sta $E0C034 *** lda [oteH],y sta teH iny iny lda [oteH],y sta teH+2 lda [otype],y sta type * ------------------- individual routine ----------------- inc gaga *** lda gaga *** inc a *** sta $E0C034 *** lda $E0C030 ~HandToPtr teH,#teRec,#$106 ldx #$D8 lda teRec,x sta theChar * do conversion stuff lda theChar example... and #$005F sta outChar ~PtrToHand #outChar,outH,#2 ldx #$DC keyRecord.theInputHandle lda outH sta teRec,x lda outH+2 sta teRec+2,x ldx #$E4 keyRecord.theOpcode stz teRec,x ~PtrToHand #teRec,teH,#106 * ------------------- Remove input parameters from stack ply pull original DP, save in y lda 2,s Move RTL addr down over inp parms sta 8,s lda 0,s sta 6,s tsc now move SP over inp parms clc adc #6 add number input parm bytes to SP tcs and reset stack tya restore original DP tcd * lda #2 *** * sta $E0C034 *** rtl back to Window Mgr teH ds 4 type ds 2 tePtr ds 4 theChar ds 2 outChar ds 2 gaga ds 2 end \ No newline at end of file diff --git a/tools.asm b/tools.asm new file mode 100644 index 0000000..bb9a92a --- /dev/null +++ b/tools.asm @@ -0,0 +1 @@ + keep TOOLS **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module TOOLS **************************************************************** * * USES ... * mcopy tools.macros copy equates.asm **************************************************************** * * SUBROUTINES * CrossCursor start using Globals move4 gCrossCur,gEditCursor rts MarqueeCursor entry move4 gMarqueeCur,gEditCursor rts HandCursor entry move4 gHandCur,gEditCursor rts TextCursor entry move4 gTextCur,gEditCursor rts EraseCursor entry move4 gEraseCur,gEditCursor rts ArrowCursor entry move4 gArrowCur,gEditCursor AdjustCursor entry brl pastname procedure name to be displayed dc i2'$7771' by GSBug... dw 'AdjustCursor' pastname anop lda newCursor sta oldCursor stz newCursor ph4 #0 ~FrontWindow pl4 theWindow cmp4 theWindow,gDataWin beq x0 Edit Win not in front brl l2 x0 ph4 #0 ~GetContentRgn gDataWin pl4 contentRgn pha ~PtInRgn #gMainEvt+owhere,contentRgn * ~PtInRect #gMainEvt+owhere,#myRect pla beq l2 Cursor not in edit window ~StartDrawing gDataWin move4 gMainEvt+owhere,myPoint ***new ~GlobalToLocal #myPoint ***new pha ~PtInRect #myPoint,#gContentRect pla beq l2 inc newCursor ~SetOrigin #0,#0 l2 anop lda oldCursor cmp newCursor beq exit lda newCursor beq l3 ~SetCursor gEditCursor bra exit l3 ~InitCursor exit anop rts contentRgn ds 4 oldCursor ds 2 newCursor entry ds 2 theWindow ds 4 myPoint ds 4 myRect dc i2'20,20,220,120' end ********************************************************************* * Tool handlers * doHand start using Globals using TransData rts doErase entry rts doSingleB entry ~MoveTo xx,yy ~LineTo xx2,yy2 rts doDoubleB entry jsr MakeMatrix move4 #doubleBData+2,0 ldx doubleBData dloop stx count ~BlockMove 0,#px,#8 jsr TransForm ~MoveTo pxx,pyy add4 0,#8 ~BlockMove 0,#px,#8 jsr TransForm ~LineTo pxx,pyy add4 0,#8 ldx count dbne x,dloop rts doHatchB entry jsr MakeMatrix move4 #hatchData+2,0 ldx hatchData hloop stx count * ~BlockMove 0,#px,#8 ldy #0 * hloop2 lda [0],y * sta px,y * iny * Special Agent Cooper iny * cpy #8 * bcc hloop2 * jsr TransForm ~MoveTo pxx,pyy add4 0,#8 ~BlockMove 0,#px,#8 jsr TransForm ~LineTo pxx,pyy add4 0,#8 ldx count dbne x,hloop rts doWedgeB entry a somewhat different procedure... jsr MakeMatrix move4 #wedgeBData+2,0 ~BlockMove 0,#px,#8 jsr TransForm ph4 #0 ~OpenPoly pl4 myPoly ~MoveTo pxx,pyy add4 0,#8 ldx wedgeBData dwloop stx count ~BlockMove 0,#px,#8 jsr TransForm ~LineTo pxx,pyy add4 0,#8 ldx count dbne x,dwloop ~ClosePoly ~PaintPoly myPoly ~FramePoly myPoly rts myPoly ds 4 doCycloPropane entry jsr MarqueeCursor rts doCycloPentane entry jsr MarqueeCursor rts doCycloHexane entry jsr MarqueeCursor rts doBenzene entry jsr MarqueeCursor rts doSeat entry jsr MarqueeCursor rts doMarquee entry jsr dragRect rts doText entry lda fTextFlag beq firstTime * test jsr EndText save old LE-text before making new firstTime anop lda #1 sta fTextFlag ph4 #0 ~LoadResource #kPicResID,#kToolPicID pl4 toolBar * _SetField LEditH,#$c8,#KeyFilter,#4 * bra gaga _Deref LEditH,LEditPtr **** new lda LEditPtr * sta <0 * lda LEditPtr+2 * sta <2 * ldy #$c8 * lda # Window add2 xx,gXoffset *** add2 xx2,gXoffset *** ~PtrToHand #TheSegment,gLink,#segSize move4 gNewLink,gLink rts penSize ds 4 end DoTXEdit start ;AtomText click handler using globals move4 gTheText,theHandle ph4 #0 ~GetHandleSize theHandle pl4 hLen ~HandToPtr theHandle,TheText,hLen lda txLink check for last item in list ora txLink+2 * beq newTXItem lda txLen and #$FF sta tLen ~LESetText #txString,tLen,LERecHndl ;noch zu bilden... rts theHandle ds 4 hLen ds 4 tLen ds 2 LERecHndl ds 4 end doDataWin start using Globals ~SetPenSize gPenSize+2,gPenSize move4 gMainEvt+owhere,myPoint move4 gMainEvt+owhere,myPoint2 *** New Ruler Stuff ~GlobalToLocal #myPoint2 lda myPoint2 cmp #18 ruler heigth bcs content * jsr HandleRuler in WINDOWS jmp tdExit *** end ruler stuff content anop * stz fShift * lda gMainEvt+omodifiers * and #shiftKey * beq l4 * inc fShift *l4 anop pha ~FindControl #gTaskDa2,#gMainEvt+owhere+2,#gmainEvt+owhwere,gDataWin pl2 gTaskDa3 lda gTaskDa3 * and #$FFFF beq okContent jsr doControls brl exit2 okContent anop ~StartDrawing gDataWin ~SetPenSize #2,#1 ~GlobalToLocal #myPoint lda myY ldx myX jsr gridIt 'grid' the point sta yy stx xx *------------------------------------------------------------------------* * Tool Dispatch code * lda gToolID bne l7 jsr doHand brl exit l7 cmp #1 bne l8 jsr doErase brl exit l8 cmp #11 bne l9 jsr doMarquee brl exit l9 cmp #12 bne l10 jsr doText brl exit l10 cmp #6 bcs l1 jsr dragLine bcs l11 brl exit l11 lda gToolID asl a tax jsr (toolTable,x) jsr StoreData tdExit rts l1 cmp #11 bcs l2 bra exit l2 cmp #17 bcc l3 bra exit l3 jsr dragLine bcc exit lda gToolID sec sbc #11 asl a tax jsr (toolTable2,x) jsr StoreData exit ~SetOrigin #0,#0 exit2 rts gridIt anop pha txa lsr a lsr a ldy fShift half grid if SHIFT pressed bne g1 lsr a lsr a asl a asl a g1 asl a asl a tax pla lsr a ldy fShift bne g2 lsr a lsr a asl a asl a g2 asl a rts temp ds 2 dragLine entry ~SetPenMode #notXOR ~MoveTo xx,yy move4 point2,oldPoint ~GetMouse #point2 lda y2 ldx x2 jsr gridIt sta yy2 stx xx2 ~LineTo xx2,yy2 drLoop lda point2 cmp oldPoint bne dr1 lda point2+2 cmp oldPoint+2 beq dr2 dr1 ~LineTo xx,yy ~LineTo xx2,yy2 dr2 pha ~StillDown #0 pla beq dr3 move4 point2,oldPoint oldPoint = point2 ~GetMouse #point2 lda y2 ldx x2 jsr gridIt sta yy2 stx xx2 brl drLoop dr3 ~LineTo xx,yy ~SetPenMode #modeCopy lda xx test, if p1=p2 cmp xx2 equal: clear carry (nothing to do bne dr4 any more!) lda yy cmp yy2 bne dr4 clc equal! bra dr5 dr4 sec not equal dr5 rts dragRect entry ~SetPenMode #notXOR move4 myY,myRect move4 #0,myrect+4 move4 myY,oldRect move4 #0,oldRect+4 move4 myRect+4,oldRect+4 ~GetMouse #myRect+4 ~FrameRect #myRect drRLoop lda myRect+4 cmp oldRect+4 bne drR1 lda myRect+6 cmp oldRect+6 beq drR2 drR1 ~FrameRect #oldRect ~FrameRect #myRect drR2 pha ~StillDown #0 pla beq drR3 move4 myRect+4,oldRect+4 oldPoint = point2 ~GetMouse #myRect+4 brl drRLoop drR3 ~FrameRect #myRect ~SetPenMode #modeCopy rts myRect ds 8 oldRect ds 8 toolTable entry *--------------------------------------------- dc i2'doHand' 0 dc i2'doErase' 1 dc i2'doSingleB' 2 dc i2'doDoubleB' 3 dc i2'doHatchB' 4 dc i2'doWedgeB' 5 * -------------------------------------------- toolTable2 entry dc i2'doMarquee' 11 dc i2'doText' 12 dc i2'doDottedB' 13 dc i2'doTripleB' 14 dc i2'doWHatch' 15 dc i2'doCChain' 16 myPoint anop myY ds 2 myX ds 2 point2 anop y2 ds 2 x2 ds 2 myPoint2 anop ds 4 oldPoint ds 4 fShift ds 2 end doControls start using Globals ~SysBeep rts end \ No newline at end of file diff --git a/windows.asm b/windows.asm new file mode 100644 index 0000000..f2b5062 --- /dev/null +++ b/windows.asm @@ -0,0 +1 @@ + keep WINDOWS **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module WINDOWS **************************************************************** * * USES ... * mcopy windows.macros copy equates.asm **************************************************************** * * Window stuff * DrawToolWin start Tool window content draw defProc using Globals phd save caller's DP phb save caller's Data Bank phk Data Bank := Pgm Bank plb * ph4 #0 * ~LoadResource #rPicture,#kToolPicID * pl4 toolPic * ~DrawPicture toolPic,#destRect ~DrawControls gToolWin lda gToolID jsl HiliteSelection plb restore caller's Data Bank pld restore caller's DP rtl *ToolPic ds 4 *destRect dc i2'0' top 13 * dc i2'0' left 2 * dc i2'179' bottom 31 45 156 * dc i2'64' right 512 626 UpdateToolWin entry ~BeginUpdate gToolWin jsl DrawToolWin ~EndUpdate gToolWin rts HiliteSelection entry * --------------------------------------- * Input : Tool Number in A * Output: none * Action: Invert Tool in Toolbar * --------------------------------------- stz xOffset initialize x offset for tool hilite cmp #11 bcc left ldy #32 it's in the right column sty xOffset sec sbc #11 left asl a Tool number * 16 -> y coordinate asl a asl a asl a clc *** New: adc TBOffset *** New: add title Bar offset sta yOffset clc adc #15 hilight is 15 pixels high sta bottom lda xOffset clc adc #30 ...and 30 wide sta right ~InvertRect #myRect rtl myrect anop yOffset ds 2 xOffset ds 2 bottom ds 2 right ds 2 end DrawEaster start using Globals ~BeginUpdate gEasterWin ~DrawControls gEasterWin ~EndUpdate gEasterWin rtl end DrawDataContent start Data Window content draw defProc using Globals phd save caller's DP phb save caller's Data Bank phk Data Bank := Pgm Bank plb jsr displayIt in 'TOOLS' plb restore caller's Data Bank pld restore caller's DP rtl end DrawInfoBar start using Globals theWindow equ 6 Offset to the infoBar owner window infoRefCon equ theWindow+4 Offset to the window's infoBarRefCon infoRect equ infoRefCon+4 Offset to the infoBar's enclosing RECT phd save current DP tsc tcd switch to DP in stack ldy #0 *** new: save InfoRect into gInfoRect lda [14],y sta gInfoRect iny iny lda [14],y sta gInfoRect+2 iny iny lda [14],y sta gInfoRect+4 iny iny lda [14],y sta gInfoRect+6 *** end new * ------------------- individual routine ----------------- * ph4 #0 * ~LoadResource #rPicture,#kButtonBarID * pl4 btnPic besser in InfoRefCon speichern * ~DrawPicture btnPic,#btnRect * ------------------- Remove input parameters from stack ply pull original DP, save in y lda 2,s Move RTL addr down over inp parms sta 14,s lda 0,s sta 12,s tsc now move SP over inp parms clc adc #12 add number input parm bytes to SP tcs and reset stack tya restore original DP tcd rtl back to Window Mgr btnRect dc i2'13,2,30,552' destRect for Button Bar (0,0,16,549) btnPic ds 4 end HandleInfo start * using Globals * ~StartInfoDrawing #gInfoRect,gDataWin * ~EndInfoDrawing rts end HandleRuler start using Globals * ~StartDrawing gEditWindow move4 gMainEvt+owhere,myPoint ~GlobalToLocal #myPoint pha ~PtInRect #myPoint,#XRect pla beq l1 ~InvertRect #XRect l1 pha ~PtInRect #myPoint,#OKRect pla beq l2 ~InvertRect #OKRect l2 pha ~PtInRect #myPoint,#EditRect pla beq l3 ~InvertRect #EditRect l3 pha ~PtInRect #myPoint,#DirRect pla beq l4 ~InvertRect #DirRect l4 pha ~PtInRect #myPoint,#PSRect pla beq l5 ~InvertRect #PSRect l5 pha ~PtInRect #myPoint,#CRect pla beq l6 ~InvertRect #CRect l6 pha ~PtInRect #myPoint,#HRect pla beq l7 ~InvertRect #HRect l7 pha ~PtInRect #myPoint,#ORect pla beq l8 ~InvertRect #ORect l8 pha ~PtInRect #myPoint,#NRect pla beq l9 ~InvertRect #NRect l9 pha ~PtInRect #myPoint,#SRect pla beq l10 ~InvertRect #SRect l10 pha ~PtInRect #myPoint,#PRect pla beq l11 ~InvertRect #PRect l11 pha ~PtInRect #myPoint,#PopRect pla beq l12 ~InvertRect #PopRect l12 anop * ~SetOrigin #0,#0 rts myPoint ds 4 theWindow ds 4 XRect dc i2'16,8,27,30' OKRect dc i2'16,32,27,54' EditRect dc i2'16,56,27,180' DirRect dc i2'16,182,27,204' PSRect dc i2'16,211,27,245' CRect dc i2'16,247,27,269' HRect dc i2'16,271,27,293' ORect dc i2'16,295,27,317' NRect dc i2'16,319,27,341' SRect dc i2'16,343,27,365' PRect dc i2'16,367,27,387' PopRect dc i2'16,396,27,546' end *GetDataMem start Get Memory for File Data * using Globals * ph4 #0 * ~NewHandle gMemSize,gMyID,#0,#0 * sta gToolErr * pl4 gDataHandle * rts * end remember to check for errors on return! OpenWindow start using Globals jsr EndText * jsr SetTheFont *wirkts? ph4 #0 ~NewWindow2 #0,#0,#0,#0,#RefIsResource,#kDataWID,#rWindParam1 pl4 gDataWin ph4 #0 ~GetPort pl4 thePort lda fCacheWins bne ow1 brl noCache ow1 anop ph4 #0 ~NewHandle #$10000,gMyID,#attrLocked,#0 sta gToolErr pl4 picHandle jsr Error bcc offPok2 stz fCacheWins * Could not allocate Mem -> no cache brl noCache offPok2 ph4 #0 ~NewHandle #170,gMyID,#attrLocked,#0 sta gToolErr pl4 theHandle jsr Error bcc offPok stz fCacheWins * Could not allocate Mem -> no cache brl noCache offPok anop _Deref picHandle,ptrToPixImage _Deref theHandle,gOffPort ~OpenPort gOffPort init offscreen port (becomes current) lda masterSCB sta portSCB ~SetPortLoc #locInfo sta gToolErr * jsr Error * ~GetPortRect #cleanRect sta gToolErr * jsr Error * ~SetSolidBackPat #$F sta gToolErr * * ~SysBeep jsr Error * ~EraseRect #cleanRect ~PenNormal noCache anop lda #-kRulerH sta gYoffset stz gXoffset lda #kDataWidth sta gDocW lda #kDataHeigth sta gDocH ~StartDrawing gDataWin ~SetPort thePort ***************** THIS STUFF NEVER USED ***************************** * ph4 #0 * ~LoadResource #rPicture,#kButtonBarID * pl4 btnPic * ~DrawPicture btnPic,#btnRect * ~PenNormal * ~MoveTo #portRect+2,#15 draw ruler's border line * ~LineTo #portRect+6,#15 * ~SetOrigin #0,#0 * ~SetInfoDraw #DrawInfoBar,gDataWin * ~SetDataSize #kDataWidth,#kDataHeigth,gDataWin * ~SetScroll #64,#32,gDataWin ~SetContentDraw #DrawDataContent,gDataWin ~SetWTitle gTitlePtr,gDataWin ph4 #0 ~GetCtlHandleFromID gDataWin,#TEditID pl4 LEditH * henriks code * lda LEditH * ldy LEditH+2 * brk 0 ph4 #0 ~GetCtlHandleFromID gDataWin,#hScrlID pl4 hScrollH ph4 #0 ~GetCtlHandleFromID gDataWin,#vScrlID pl4 vScrollH ph4 #0 ~GetCtlHandleFromID gDataWin,#MountnID pl4 MountnH ph4 #0 ~GetCtlHandleFromID gDataWin,#SizeBxID pl4 sizeBoxH ph4 #0 ~GetCtlHandleFromID gDataWin,#TBarCID inactive ToolBar Pict Ctl pl4 TBarH jsr SetMinGrow Set minV,minH in ctlData of SizeBox ~HideControl LEditH **** TEControl Record = TERecord !!! **** * _SetField LEditH,#$C8,#KeyFilter,#4 ~ShowWindow gDataWin * ~SysBeep rts portRect ds 8 btnRect dc i2'0,0,17,639' destRect for Button Bar (0,0,16,549) btnPic ds 4 most recent: 0,0,17,550 thePort ds 4 theRgn ds 4 cleanRect ds 8 theHandle ds 4 end SetMinGrow start using Globals ~SetCtlTitle #$00CC0044,sizeBoxH ;LoWrd=minH=68; HiWrd=minW=204 rts end DrawTopWindow start * ~SetForeColor #0 * ~SolidPattern #0,myPattern * ~SetPenPat myPattern * ~SetPenSize #1,#1 * ~FrameOval #myRect * ~SetFontID #0 * ~SetPenMode #modeForeCopy * ~MoveTo #150,#200 * ~DrawCString #myString rts myPattern ds 32 myRect dc i2'10' top dc i2'10' left dc i2'388' bottom dc i2'580' right myString dc c'Hello, old friend!!!',h'0D00' end HandleContent start using Globals using Version **only for easter window cmp4 gTaskDta,gToolWin bne l1 jsr doTool rts l1 anop cmp4 gTaskDta,gDataWin beq sameDataWin jsr SelDataWin bra exit sameDataWin anop jsr doDataWin in Module TOOLS exit rts SelDataWin entry jsr EndText ph4 #0 ~GetWRefCon gDataWin pl4 theHandle sta gToolErr **** test ~PtrToHand #FileInfo,theHandle,#FInfoSize sta gToolErr **** test ~SelectWindow gTaskDta if not tool window, hilight it ph4 #0 ~GetWRefCon gTaskDta pl4 theHandle ~HandToPtr theHandle,#FileInfo,#FInfoSize * move4 gTaskDta,gDataWin **** eigentlich ueberfluessig... jsr Error **** test jsr EndText rts doTool anop it's the Tool window, so handle it lda gToolID sta oldToolID ph4 #0 ~GetPort pl4 tmpPort ~SetPort gToolWin move4 gMainEvt+owhere,myPoint ~GlobalToLocal #myPoint lda myPoint cmp TBOffset if myPoint < TBOffset: in Tool Title bcc doTTitle cmp #178 is it past the last window bcs doEaster brl l3 doEaster ph4 #0 ~FrontWindow pl4 theWindow lda theWindow cmp gEasterWin bne notInFront lda theWindow+2 cmp gEasterWin+2 bne notInFront brl l4 doTTitle anop Handle Tool Title rts notInFront ~BringToFront gEasterWin l4 ~ShowHide #1,gEasterWin ~StartDrawing gEasterWin ******************************************** START OF TEST STUFF **** ~MoveTo #0,#8 ~DrawString #testTitle ~DrawString gTitlePtr ~MoveTo #0,#20 lda fSaved beq tst1 ~DrawString #fsStr tst1 ~MoveTo #0,#28 lda fNamed beq tst2 ~DrawString #fnStr tst2 ~MoveTo #0,#36 lda fFullAccess beq tst3 ~DrawString #ffStr tst3 ~MoveTo #0,#44 lda fOpened beq tst4 ~DrawString #foStr tst4 ~MoveTo #0,#52 ~MoveTo #0,#60 ~Int2Hex gRefNum,#rfStr+10,#4 ~DrawString #rfStr ~MoveTo #0,#68 ~Int2Hex gDataWNum,#wnStr+15,#4 ~DrawString #wnStr ~MoveTo #0,#76 *** new... ~Int2Dec dPortRect,#prString+11,#5,#1 ~Int2Dec dPortRect+2,#prString+17,#5,#1 ~Int2Dec dPortRect+4,#prString+23,#5,#1 ~Int2Dec dPortRect+6,#prString+29,#5,#1 ~DrawString #prString ~MoveTo #0,#84 ~Int2Dec winW,#wwhString+9,#5,#1 ~Int2Dec winH,#wwhString+15,#5,#1 ~DrawString #wwhString *** ...end new ~MoveTo #0,#160 ~DrawString #VersionStr ***************************************** END OF TEST STUFF **** * ~DrawControls gEasterWin ~SetOrigin #0,#0 loop pha ~StillDown #0 pla bne loop ~ShowHide #0,gEasterWin brl exit2 l3 anop myPoint y coordinate of mouse loc sec sbc TBOffset * New: substract Title Bar offset lsr a divide by 8 -> offset into jsr-Table lsr a lsr a lsr a sta gToolID asl a tax lda myPoint+2 x coordinate cmp #32 is it in the right column? bcc ok no txa clc adc #22 'offset offset' for right column lsr a sta gToolID ok lda oldToolID jsl HiliteSelection lda gToolID jsl HiliteSelection jsr DoTheTool exit2 ~SetPort tmpPort jsr UpdateToolWin update hilight rts testTitle dw 'FILE INFO ON: ' fsStr dw 'SAVED' fnStr dw 'NAMED' ffStr dw 'FULL ACCESS' foStr dw 'OPENED' rfStr dw 'RefNum: ' wnStr dw 'Open Windows: ' prString dw 'PortRect: , , , ' wwhString dw 'winW,H: , ' doTheTool entry lda gToolID asl a tax jsr (toolTable,x) lda gToolID cmp #TextToolID beq textOk jsr EndText textOK anop rts HandTool entry jsr HandCursor rts EraseTool entry jsr EraseCursor rts SingleBTool entry jsr CrossCursor rts DoubleBTool entry jsr CrossCursor rts HatchBTool entry jsr CrossCursor rts WedgeBTool entry jsr CrossCursor rts MarqueeTool entry jsr ArrowCursor ~InitCursor rts TextTool entry jsr TextCursor rts DottedBTool entry jsr CrossCursor rts TripleBTool entry jsr CrossCursor rts WHatchTool entry jsr CrossCursor rts CChainTool entry jsr CrossCursor rts toolTable anop *------------------------------------------------- dc i2'HandTool' 0 dc i2'EraseTool' 1 dc i2'SingleBTool' 2 dc i2'DoubleBTool' 3 dc i2'HatchBTool' 4 dc i2'WedgeBTool' 5 dc i2'doCycloPropane' 6 dc i2'doCycloPentane' 7 dc i2'doCycloHexane' 8 dc i2'doBenzene' 9 dc i2'doSeat' 10 * -------------------------------------------- dc i2'MarqueeTool' 11 dc i2'TextTool' 12 dc i2'DottedBTool' 13 dc i2'TripleBTool' 14 dc i2'WHatchTool' 15 dc i2'CChainTool' 16 dc i2'doCycloButane' 17 dc i2'doCycloPentane2' 18 dc i2'doBenzene2' 19 dc i2'doWheeland' 20 dc i2'doBasin' 21 dc i2'Ignore' dummy dc i2'Ignore' dummy tmpPort ds 4 myPoint ds 4 theWindow ds 4 theHandle ds 4 testit ~SysBeep rts end \ No newline at end of file diff --git a/xform.asm b/xform.asm new file mode 100644 index 0000000..f78c5d2 --- /dev/null +++ b/xform.asm @@ -0,0 +1 @@ + keep XFORM **************************************************************** * ChemiGS * **************************************************************** * A Drawing Program for Chemical Structures * * (c) 1992-93 by Urs Hochstrasser * * Buendtenweg 6 * * 5105 AUENSTEIN (SWITZERLAND) * **************************************************************** * Module XFORM **************************************************************** * * USES ... * mcopy xform.macros copy equates.asm ************************************************************************ * Display procedures * * Make Matrix: rotation and stretching of stored primitives, as * ------------ hatched and dotted lines, wedges etc. * * x' = x * TM11 + y * TM12; TM11 = S * cos theta, TM12 = -S * sin theta * y' = x * TM21 + y * TM22; TM21 = S * sin theta, TM22 = S * cos theta * * Transform: transform points in primitive definition with * ---------- Transformation Matrix * MakeMatrix start using Globals using TransData ph4 #0 Create a FIXed '2' ~Long2Fix #2 pl4 Fix_2 ph4 #0 ~Long2Fix #-2 Create a FIXed '-2' pl4 Fix_Neg2 sub2 xx2,xx,dx sub2 yy2,yy,dy DIV2 dx,#2 dx/2, then stretch later (for asp. rat) ph4 #0 ~Multiply dx,dx (dx/2)^2 -> dx2 pl4 dx2 ph4 #0 ~Multiply dy,dy dy^2 -> dy2 pl4 dy2 ADD4 dx2,dy2,L sum of it -> L SQRT4 L Square root of L into L ph4 #0 ~FixRatio L,ex L/ex -> S (only loWrd of L) pl4 S ph4 #0 ~FixRatio dx,L dx/L -> cos_th pl4 cos_th ph4 #0 ~FixRatio dy,L dy/L -> sin_th pl4 sin_th ph4 #0 ~FixMul S,cos_th pl4 tm22 S * cos_th -> tm22 ph4 #0 ~FixMul tm22,Fix_2 pl4 tm11 S * cos_th * 2 -> tm11 ph4 #0 ~FixMul S,sin_th pl4 tm21 S * sin_th -> tm21 ph4 #0 ~FixMul tm21,Fix_Neg2 pl4 tm12 S * sin_th * -2 -> tm12 rts Transform entry ph4 #0 ~FixMul px,tm11 pl4 temp ph4 #0 ~FixMul py,tm12 pl4 temp2 ADD4 temp,temp2 ph4 #0 ~Fix2Long temp pl4 temp add2 temp,xx,pxx ph4 #0 ~FixMul px,tm21 pl4 temp ph4 #0 ~FixMul py,tm22 pl4 temp2 ADD4 temp,temp2 ph4 #0 ~Fix2Long temp pl4 temp add2 temp,yy,pyy rts Fix_2 ds 4 Fix_Neg2 ds 4 temp ds 4 temp2 ds 4 dx ds 2 dx2 ds 4 dy ds 2 dy2 ds 4 L ds 4 LONG, INTEGER ex dc i2'16' INTEGER s ds 4 FIX cos_th ds 4 FIX sin_th ds 4 FIX end TransData data tm11 ds 4 FIX tm12 ds 4 FIX tm21 ds 4 FIX tm22 ds 4 FIX px ds 4 FIXed points from primitive def py ds 4 pxx ds 2 Integer Results from Transform Proc pyy ds 2 count ds 2 doubleBData dc i2'2' dc i2'0,0,0,-1,0,16,0,-1' FIX '0,-1,16,-1' dc i2'0,0,0, 1,0,16,0, 1' FIX '0, 1,16, 1' hatchData dc i2'9' number of line segments dc i2'0, 0,0,-1,0, 0,0,1' FIX ' 0,-1, 0,1' dc i2'0, 2,0,-1,0, 2,0,1' FIX ' 2,-1, 2,1' dc i2'0, 4,0,-1,0, 4,0,1' FIX ' 4,-1, 4,1' dc i2'0, 6,0,-1,0, 6,0,1' FIX ' 6,-1, 6,1' dc i2'0, 8,0,-1,0, 8,0,1' FIX ' 8,-1, 8,1' dc i2'0,10,0,-1,0,10,0,1' FIX '10,-1,10,1' dc i2'0,12,0,-1,0,12,0,1' FIX '12,-1,12,1' dc i2'0,14,0,-1,0,14,0,1' FIX '14,-1,14,1' dc i2'0,16,0,-1,0,16,0,1' FIX '16,-1,16,1' wedgeBData dc i2'3' dc i2'0,0,0,0,0,16,0,-2' dc i2'0,16,0,2,0,0,0,0' dottedBData dc i2'4' dc i2'0, 0,0,0,0, 2,0,0' FIX ' 0,0, 2,0' dc i2'0, 4,0,0,0, 6,0,0' FIX ' 4,0, 6,0' dc i2'0, 8,0,0,0,10,0,0' FIX ' 8,0,10,0' dc i2'0,12,0,0,0,14,0,0' FIX '12,0,14,0' tripleBData dc i2'3' dc i2'0,0,0,-2,0,16,0,-2' FIX '0,-2,16,-2' dc i2'0,0,0, 0,0,16,0, 0' FIX '0, 0,16, 0' dc i2'0,0,0, 2,0,16,0, 2' FIX '0, 2,16, 2' wHatchData dc i2'9' dc i2'0,0,0,0,0,0,0,0' dc i2'0,2,$C000,-1,0,2,$4000,0' dc i2'0,4,$8000,-1,0,4,$8000,0' dc i2'0,6,$4000,-1,0,6,$C000,0' dc i2'0,8,0,-1,0,8,0,1' dc i2'0,10,$C000,-2,0,10,$4000,1' dc i2'0,12,$8000,-2,0,12,$8000,1' dc i2'0,14,$4000,-2,0,14,$C000,1' dc i2'0,16,0,-2,0,16,0,2' cchainData dc i2'2' ...not really a c chain any more... dc i2'0,0,0,0,0,16,0,0' FIX '0,0,16,0' dc i2'0,3,0,3,0,13,$FF00,2' FIX '3,3,13,2.9' end \ No newline at end of file