From 9e441de1c2bc8e009e16625b4acacf712ed2b50b Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sun, 29 Apr 2018 19:13:03 -0700 Subject: [PATCH] Version 1.2 with IRQ fixes and mouse module --- PLASMA-BLD1.PO | Bin 143360 -> 143360 bytes PLASMA-SYS1.PO | Bin 143360 -> 143360 bytes src/inc/mouse.plh | 32 ++ src/libsrc/apple/mouse.pla | 561 ++++++++++++++++++++++++++++++++++++ src/makefile | 7 +- src/mkrel | 3 + src/samplesrc/mousetest.pla | 23 ++ src/vmsrc/apple/a1cmd.pla | 2 +- src/vmsrc/apple/cmd.pla | 2 +- src/vmsrc/apple/plvm02.s | 1 + src/vmsrc/apple/soscmd.pla | 2 +- 11 files changed, 629 insertions(+), 4 deletions(-) create mode 100644 src/inc/mouse.plh create mode 100644 src/libsrc/apple/mouse.pla create mode 100644 src/samplesrc/mousetest.pla diff --git a/PLASMA-BLD1.PO b/PLASMA-BLD1.PO index ed98e66184b761e1abbce34c2429e0fd1e086100..553f8a4d6dbcd1493870e33b0c1534888034006f 100644 GIT binary patch delta 3726 zcmaKuTW}NC8OP5#I@Zbt8OI8-Wka&TU`dv2`9cX%NgvkdbyIZW~4wSg&flkI6a;c1U|KZ+Ah&!iR-3;{y>k!ce(`ve^14$C8Z%620|gf zqi7T4wxN1-Lo2s>+3m9zlg0mUG9v=8FeF&z?;v4br&nSW(I_zcWC=?W)a2!SWt$*0 z2|?6WrKHo#4F;WML3#{QvX97}1H%;UfISL&1&4&6wHaha&ckxn==UV8!$IePqIvo~ z&`eZm>H?f3E8yYx0ozlx8|DDlKj`eTb6%TJ05pT@(7zkxRy#$^YxRTKB-9c;hm7c< zfSfakT%p_mdk?iDrcaI;1Ad>~>amw%xQaCB`8GLb2)dm^&LRYAHCTZ#IU?uud%cB}x#J$K(T?^>h}HS_`YTw`c>iW$Jkv;X|7s^I?Kyk}lO`<;uHo!5 zCf}~tp4GmANnZQcPjF4^)(0PAVeU50{Y|OLD}TO<)epCA-_fqq8#;`p&Mug{hBLot zP9oHgK9*JTLL0iIQ;T&Y+-`<)s?#-F1N}jWbf8dCv>Ph4Pj<}AsKf4c1c%EY?L{@{ zLuF;^%t&kJd~PmT)}y;X?t-k~&8P_)P8ot7djzoCRhSk!iBkg7-GIGN?VQW)ak}|l zAx4p;7C0!c%Ni4S=kfwa$7HhAbzk)%$*996NldN^PIelLH%1VQQoY`795 z8gqVaqK@QMBR4Va>D&1gsEjXhZj4c$VUCeAOc%*BER>ZhbQ3EceeA0+eFx_bGBnR@ zyM;5;gg(B{Y7-aDG0Hr%|1QoeJ75K~2=fn;q#5$k0!`2>*+)76uDGfKGYHMC=r5#m zKXe#4Q5EkXs4%~0$a~1&RV-WT1uP&tb!OD!=K>*jvb@=p1FPSvOn}CW^g*kSZwaNW zA3z(?XPf0#4M7LI)XE%v60An5oNEdC9AYmO^~UKaSZ%I~)fn`shuyxrTi_}Hc$0)g3V@wbK-jZUFE`|Lu!Ln(2Szo?A)9B^?F)&D1=a4| z)v9F%RJ(Ud0A8;`f(Lq~{+rFLH#Qz!FRmm6R&Zg|>9g8APBE~1xKLp3#UVoBcPx>ZRjUQREs|7po7lcbO)UKN_8HV>vj~(nrm}`l z70*PWAW!jU_b?n@I7P)FX-OIi_DXW=t^a?^)1PWcQ*!DkoHHn43lyesqc3k2oP(*D zWg?b{EuPeu<25|S&MhP&dL64Pv*l?M%clc6ji|eR!4{=M_s|w3+AI3k-o32OsADY_ zRyR^Gd~|A7C~RpELsQ3vO}5xPl2AsVt92WV0?n_Qj>YEG6VXJZkVQ%5=?(dJ{$b|7 z-O`z>q<(rfHuv@Ucw*ti(~BpcN#X14O1P6eLejM_;duW28~Wkpb9gJR6;slsGo(Mv zSBKsmHb;38Tx_(o`eK34O qiG>T6tY%-v4e8gin5Ivi#j2H!TgY{sd4^=#F|5UzZ;)&UQT`8%V135` delta 4952 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 diff --git a/PLASMA-SYS1.PO b/PLASMA-SYS1.PO index d99e2e4fbf28acc244a9128ea395081e3e4a68c2..5220d5c60d129dd7bfc240b6e76cf92cbd499a4d 100644 GIT binary patch delta 3239 zcmZXW4_FiT8OPt>FBcL);TJ(s0SzVui9wltd{8n1zU@@jsGe-H|yh`KC>%IyRk9b9((TsG?IIs&)xfb z?|bj>-+S-f+E3MMKUE)`%4O*0SqmWIh*3iO`-d%d%wKE%^>> z{xruThtq5Y=pPRwV0=96+yJr?BqfFEVcGX)4G8-ug9;vrg{}JZQBpuz<~_q@Wn98Y z5j{gfF(?3HWS6XztYD%tPDK>KNh5EOH$voxM0+eZL^_CCH6k`{BjO<^Yx93Ld`e5JK}dJH(l?(PQ3XEt*UVo zQc}|)?}U7h&G=D#E%|B7w8@!x0l?rWy#-!`?8HUUtq4$Zc2=7Hyz}OqIOX5i(uD z{89kyfAA0;sIx`s^aTs%*#|Xv70ZExbmj1Hlg$sLE{K&d8djwbml@3#v(+(eUP*yj zj_HnB4jKUMkWS9=V#qW*7nnCF;ww1S=cK8+)rk>nGPTe?>!F+(L&J-C4JQGUhr$gEE~C)ya7Om($6mjP>Qz^0 zFB=?~bQRyk*LemTiY6H}u{bC`OsP;xD7BUZ$qtbSk6~(jPPtNN*<+Y5-;luFn1GEc z9$!>}&2LGdi3=Q|njbIz$xo}E_}R~^m$;s+Sz7zlvY_VZy>xu}xMN%_`G&Ax)U9~> znU(dcR{xTJw&A%ozru%mh!9UE3Xc$~e15Ixg%{EFH4)|#bznPH{CeH`aC|=(c#Co` z|7OFhayv*4^ee-0mtow5jjwNN-0a=rdt+tLU+A`emsQ75_hOXJU^QE<(%Ug`h%LBr z2F(K-mx#${Eh%$^(^wXY?Kn7Z)ZoV2OG=#)$>$c|!(Qi*;o;syLd+)hB*gDJ0bltk7P5U*pnq^NM24ttR_ zkHL82UvaLpqxLJqS?IJ!6aw)UesDVD9vB>lO9z1*syJ})P&nUaa>6FeoWn=n31`k0 z%p409W)dni5jx`CKOH~u=aa2%r{oM0wiD()Pw5hXbu1RnY1%*RxOB|{o$LauVqL78 zDKuuy4$ToPD}zUu7CH{HeQQ)rS?V6eUErFs)`dvbUF@gBpJ#y%>EpofYTeTep4Rd$ zAzxdSpX==GRP!x7=eyX#D}AS1`Z(W(mOiELR15D``9jU$YnxJ4j$g^u#4wdPZLA)u z!7?3cjLb-rEDT)4$mnVUyph@EmIhmRcO*KhA-*2$p?(*sP=ueZG?=6ymF1MwPGK&n z$zU~^%*f%ASI}A=n_(P7t7zEm4*M(1IqCuv&(#c-iyM8~JiT6TIS$jt6xOX;Uahs(ty;N6yL7pB<+8eZtq!{|=G5phQW8a5 zYSMur7_wOdE^}UZAd+ZJhNN4AqvIyM~ z?q7qM;TrG@q@CjzhUH0;+`>@HKN0qfAGRntCeT*eoI^fBE+SWu8^|r>?*NT=Al7pi z?LOpdYy*k)j3nS0i)axeG9CE=l1rd5AMYYFYSQ|VKQS2DWMSg@7;Jx`Y z&QpxG4RInB$YR7r%fPb~jb{)ZS%bKd7m$~bmyr#~Ye*xq1=))Dk==-ZG$TReD0Xz5 z#(K_D*s94T$*ld9T92?4dhYf`yX_kJCB~PNuWR-c$3l(KgL!+ z36eeiL^wdGI&|^UTAHzy4 zd#8~qw9n$Tn#4T1A1m3EGU=D-yYHd+IhNo#QJy?4s)Kdp%!%^{;>TqO*?#Zp80qlnC8q-v0p;YfOm% delta 2328 zcmZWp3se+U7`}IQ_JQa+=#HSE%bSpcA}6imgFOhl3hlBhyOgMz`AAd4N0{ZKbu;sk zuVo`2DZxsUui(xL4)8)Ha;dQ&5-V+M`X827oz6K;Ap0s zN09TRcJ-77%BjYs?s|h3B&`hoJz>x0%J`(SNzJOV8SBQ@mNl%)tu1SG6eSf&H#FR7 zAdb{Ql?r)4m%y&wl-*sFc|gmbAI{+2@rF8A>X3&r$FLFQw8e36L}+YFVoiQ+ewDtN zl&y7MDGm(x1gg#)_`9&y6RSonIK0I%Fhz|Ij4AztTM`e}7FL#27C!lEwX?3cCm0)3 zLc!Rb(g)+|lyHoryQ~G&5?A@T)aem!a2Y7`;64Wg;bub%oegh-F*w+)CZFh_+IJqYRt#%GlgCj+?4ztJGP+1dW^U>crP3y*_!$)M;-_ zpYi6*S?-{Tw3)i-kyf?PKpDmCyg75{&3`)|-#ws0BUL&}8FsPCpW{XcN#Z557 z9X~S!>y25XGOY%$zr?NZ;Br3?KG(5)PySHc2Dzbra&cPEDrY=ZD~9ot{fr-HHf5NM z*a$)Jt{dytYNy*w#> z3<<;~y$yQqI9Ktcz`UOt}>+SFK+2@!ECkH*B;Q zI6f%^rI|V#`w1zq?x&l#;2Ha1B&?f98Q~IwpKUK{57trE`IwP@UgF$QipV2cihXbh zj4!_2+0Hl$##V+c+qHWS0&r!KOsJxaZ14U9<*u(0`j-kPD7z`|9F@D}HT0oWSW6kt z&$-z?^f3*pICS{PH%GtyuCnUb@#+&NPn~uLh0&%6VJfnmsX5o4Wd?q3E@c9~|KURI z#Y>leyn-;w%%@!ZBD6BroRx0Yj`22Ctj8g7v(q8rw&hVPMdq4p? zQ2b#j_SQ&7IF22zV}&!gWy%Va!)TCexbg%Ixb^2>ckbS6YQEo=*4cw|wO-yUvF55+ z+XNM{O;!>6G!<)~sgm2~U_M{P+m;}11wH^)0S;gbuni~yN`algF5m!g95@Zs0Ox^P zpboeRz56P)O~n(N8i)imfR-m#+h|O3fbl%BPvRN-6kcMV&WGC<@~nLk?n`-veI@2= zc!{k5oI;-3ioxH3xxn|em+}2$15, $00, slot, page, $04) // clearMouseFW +end +def posMouse(x, y) + // + // Fill screen holes + // + ^($0478 + index) = x + ^($0578 + index) = x >> 8 + ^($04F8 + index) = y + ^($05F8 + index) = y >> 8 + return call(rom + rom->$16, $00, slot, page, $04) // posMouseFW +end +def clampMouse(xMin, xMax, yMin, yMax) + ^$0478 = xMin + ^$0578 = xMin >> 8 + ^$04F8 = xMax + ^$05F8 = xMax >> 8 + call(rom + rom->$17, $00, slot, page, $04) // clampMouseFW + ^$0478 = yMin + ^$0578 = yMin >> 8 + ^$04F8 = yMax + ^$05F8 = yMax >> 8 + return call(rom + rom->$17, $01, slot, page, $04)) // clampMouseFW +end +def homeMouse + return call(rom + rom->$18, $00, slot, page, $04) // homeMouseFW +end +// +// Detach mouse from interrupts +// +def detachMouse + setMouse(0) + params.0 = 1 + params.1 = 0 + return syscall($41, @params) +end +// +// Identify Mouse card/slot and initialize +// +for rom = $C100 to $C700 step $0100 + if rom->5 == $38 and rom->7 == $18 and rom->11 == $01 and rom->12 == $20 + puts("Found Mouse in slot #"); putc('0' + ((rom >> 8) & $07)); putln + // + // Hook mouse IRQ handler into ProDOS IRQ chain + // + params.0 = 2 + params.1 = 0 + params:2 = @serviceMouse + syscall($40, @params) + // + // Set values + // + slot = rom >> 8 + index = slot & $07 + page = index << 4 + setMouseFW = rom + rom->$12 + // + // Fix-up IRQ routine + // + serviceMouse:2 = rom + rom->$13 // serveMouseFW + serviceMouse:7 = $0778+index + vblEvent:1 = @vblInt + mouseEvent:1 = @mouInt + updateMouse.1 = slot + updateMouse.3 = page + updateMouse:5 = rom + rom->$14 // readMouseFW + readMouse.1 = index + call(rom + rom->$19, $00, slot, page, $04) // initMouseFW + return modkeep + fin +next +// +// Not found +// +rom = 0 +done + +What follows is the relevant parts to the mouse driver for VM02 + +CHKMOUSE: LDX #$20 ; LOOK FOR MOUSE + LDA #$01 + JSR SCAN_SLOTS + BCS NOMOUSE + PHA ; SAVE SLOT + LDY #$13 + LDA (TMPTR),Y + STA SERVEMOUSE+1 ; FIXUP IRQ HANDLER + STX SERVEMOUSE+2 + LDY #$14 + LDA (TMPTR),Y + STA READMOUSE+1 ; FIXUP IRQ HANDLER + STX READMOUSE+2 + TXA + AND #$07 + STA MOUSE_SLOT + TAY + JSR MOUSE_INIT ; MAKE SURE MOUSE IS OFF, INTS OFF + LDA WARM_INIT + BNE :+ + JSR PUTS + .ASCIIZ "Mouse in slot #" + LDA MOUSE_SLOT + JSR PRBYTE + JSR CROUT +: PLA + TAY + LDA #MOUSE_DRIVER + JSR LOAD_DRIVER +; +; SCAN SLOTS FOR MATCHING CARD ID +; ENTRY: A = START SLOT SCAN +; X = CARD ID +; EXIT: A = SLOT # :: C = 0 +; X = SLOT PAGE +; +SCAN_SLOTS: ORA #$C0 + STA TMPTR+1 + LDA #$00 + STA TMPTR +CHKSIG: LDY #$05 + LDA (TMPTR),Y + CMP #$38 ; LOOK FOR PASCAL COMPAT SIG + BNE :+ + LDY #$07 + LDA (TMPTR),Y + CMP #$18 + BNE :+ + LDY #$0B + LDA (TMPTR),Y + CMP #$01 + BNE :+ + LDY #$0C + TXA ; LOOK FOR MATCHING ID + CMP (TMPTR),Y + BNE :+ + LDA TMPTR+1 + TAX + AND #$07 + CLC + RTS +: INC TMPTR+1 + LDA TMPTR+1 + CMP #$C8 + BCC CHKSIG + SEC + RTS + +;* +;* TURN VBL INTS ON AFTER INIT +;* +VBL_INIT: LDA MOUSE_SLOT + BEQ NOVBL + ASL + TAX + LSR + ORA #MOUSECTL_CALLFW + TAY + SEI ; TURN OFF INTERRUPTS + LDA LINK_DEVCTRL,X + STA CALLVBLPROC+1 + LDA LINK_DEVCTRL+1,X + STA CALLVBLPROC+2 + LDA #$08 ; TURN MOUSE OFF, LEAVE VBL ON + LDX #$12 +CALLVBLPROC: JSR $0000 + CLI ; BACK ON + LDA WARM_INIT + BNE NOVBL + JSR PUTSLN + .ASCIIZ "VBlank timer active" +NOVBL: RTS + + JSR PRODOS + .BYTE $40 ; ALLOC INTERRUPT + .ADDR ALLOCINTPARMS +.IFDEF DEBUG + BCC :+ + JSR PUTSLN + .ASCIIZ "FAILED TO ALLOCATE INTERRUPT" +: +.ENDIF + RTS +ALLOCINTPARMS: .BYTE $02 + .BYTE $00 ; INT NUM + .ADDR IO_INTERRUPT ; INT CODE + +;* +;* I/O INTERRUPT ROUTINE +;* +IO_INTERRUPT: CLD + LDY #$02 ; SLOT #1 * 2 +FNDIRQPROC: LDA LINK_DEVIRQ+1,Y + BEQ NXTIRQPROC + STA CALLIRQPROC+2 + LDA LINK_DEVIRQ,Y + STA CALLIRQPROC+1 + TYA + LSR + PHA +CALLIRQPROC: JSR $0000 + BCS :+ + PLA + TAY + PHA + JSR THREAD_NOTIFYIO +: PLA + ASL + TAY +NXTIRQPROC: INY + INY + CPY #$10 + BCC FNDIRQPROC + CLC + RTS + +;* +;* MOUSE DEVICE DRIVER +;* +MOUSE_INIT: ORA #$C0 + STA XREGMOUSE1+1 + STA XREGMOUSE2+1 + ASL + ASL + ASL + ASL + STA YREGMOUSE1+1 + STA YREGMOUSE2+1 + LDA #$00 + PHA ; DISABLE ALL MOUSE INTS + LDX #$12 ; FW INDEX FOR SETMOUSE + BNE CALLMOUSEFW +MOUSE_DRIVER: +MOUSE_DRVR_SZ: .WORD MOUSE_DRVR_END - MOUSE_DRVR_START +MOUSE_READ_OFS: .WORD MOUSE_READ - MOUSE_DRVR_START +MOUSE_WRITE_OFS: .WORD MOUSE_WRITE - MOUSE_DRVR_START +MOUSE_CTRL_OFS: .WORD MOUSE_CTRL - MOUSE_DRVR_START +MOUSE_IRQ_OFS: .WORD MOUSE_IRQ - MOUSE_DRVR_START +MOUSE_DRVR_START: +MOUSE_READ: +MOUSE_WRITE: SEC + RTS +MOUSE_X: .WORD $0000 +MOUSE_Y: .WORD $0000 +MOUSE_STATUS: .BYTE $00 +MOUSE_CTRL: PHA + TYA + AND #$F8 ; MASK OFF SLOT # + CMP #MOUSECTL_CALLFW + BNE :+ +CALLMOUSEFW: STX OPADDR +XREGMOUSE2: LDX #$C4 + STX OPADDR+1 + LDY #$00 + LDA (OPADDR),Y ; GET ENTRYPOINT OFFSET + STA OPADDR +YREGMOUSE2: LDY #$40 + PLA + SEI + JMP (OPADDR) ; CALL FIXED UP FUNCTION POINTER +: CMP #MOUSECTL_READMOUSE ; COPY MOUSE STATUS/POSITION INTO EASILY ACCESSIBLE MEMORY + BNE :+ + PLA + TYA + AND #$07 + TAX ; SAVE MOUSE PARAMETERS + ASL + TAY + LDA LINK_DEVREAD,Y + STA TMPTR + LDA LINK_DEVREAD+1,Y + STA TMPTR+1 + SEI + LDY #$02 + LDA $0478,X + STA (TMPTR),Y + PHA + INY + LDA $0578,X + STA (TMPTR),Y + INY + LDA $04F8,X + STA (TMPTR),Y + PHA + INY + LDA $05F8,X + STA (TMPTR),Y + INY + LDA $0778,X + STA (TMPTR),Y + STA TMP + PLA + TAY + PLA + TAX + LDA TMP + RTS +: CMP #MOUSECTL_CLAMPX + BEQ :+ + CMP #MOUSECTL_CLAMPY + BNE :++ +: PLA + STA $04F8 + STX $05F8 + LDA #$00 + STA $0478 + STA $0578 + TYA + LSR + LSR + LSR + AND #$01 + PHA + LDX #$17 ; FW INDEX FOR CLAMPMOUSE + BNE CALLMOUSEFW +SETMOUSE: PHA + LDX #$12 ; FW INDEX FOR SETMOUSE + BNE CALLMOUSEFW +: PLA + TYA + AND #$F8 ; MASK OFF SLOT # + CMP #IOCTL_OPEN + BNE :+ + LDA #THREAD_YIELD + STA LINK_YIELD+1 + LDA #$0F ; TURN MOUSE INTS ON + BNE SETMOUSE +: CMP #IOCTL_CLOSE + BNE :+ + LDA #$08 ; TURN MOUSE OFF + BNE SETMOUSE +: CMP #IOCTL_DEACTIVATE + BNE :+ + LDA #MOUSECTL_NOIRQ +: CMP #MOUSECTL_NOIRQ ; UNINSTALL IRQ HANDLER + BNE :+ + SEI + LDA #SW_TIMER + STA LINK_YIELD+1 + BNE SETMOUSE +: CMP #IOCTL_ID + BEQ :+ + SEC + RTS +: LDA #$20 ; MOUSE ID + CLC + RTS +; +; VBLANK TIMER AND MOUSE IRQ +; +MOUSE_IRQ: STA TMP +SERVEMOUSE: JSR $C400 + BCS VBLEXIT ; NOT MOUSE INT + LDY TMP ; CHECK MOUSE INT CAUSE + LDA $0778,Y + PHA + AND #$08 ; WAS IT VLB? + BEQ MOUSEEXIT ; NOPE, MOVE OR BUTTON +VBLTIC: LDX #$00 + LDA #$11 ; 17 MSEC (2/3 OF THE TIME) + DEC TIMERADJUST + BNE :+ + LDA #$02 + STA TIMERADJUST + LDA #$10 ; 16 MSEC (1/3 OF THE TIME) +: JSR SYSTEM_TIC +MOUSEEXIT: PLA + AND #$86 ; MOUSE MOVE OR BUTTON ACTIVE + BEQ VBLEXIT +XREGMOUSE1: LDX #$C4 +YREGMOUSE1: LDY #$40 +READMOUSE: JSR $C400 ; IIGS REQUIRES THIS HAPPEN IN IRQ + CLC + RTS +VBLEXIT: SEC + RTS +MOUSE_DRVR_END EQU * + +package apple2; +/* + * This class interfaces directly with the mouse device driver. + */ +public class Mouse +{ + static private int slot, mouseSlot, mouseCtrl, ctrlRead, addrXPos, addrYPos; + static public int xPos, yPos, status; + + public static boolean enable() + { + // + // Search for mouse card and disable VBL interrupts + // + for (slot = 1; slot < 8; slot++) + { + int mouse = vm02.call((1 << 19), 0x90 + (slot << 1)); // ID device + if ((mouse & 0x010000FF) == 0x20) // CARRY clear == valid device IOCTL, 0x20 == mouse card ID + { + mouseCtrl = 0x90 + (slot << 1); + mouseSlot = slot << 16; + ctrlRead = mouseSlot | 0x801400; + addrXPos = vm02.peekWord(0x0370 + (slot << 1)) + 2; + addrYPos = addrXPos + 2; + return (vm02.call(mouseSlot | (3 << 19), mouseCtrl) & 0x01000000) == 0; // open port + } + } + slot = 0; + return false; + } + public static void disable() + { + vm02.call(mouseSlot | (4<<19), mouseCtrl); // close port + } + public static void disableIRQ() + { + int vblSlot, vbl; + // + // Search for mouse card and disable/remove interrupts + // + for (vblSlot = 1; vblSlot < 8; vblSlot++) + { + vbl = vm02.call((1 << 19), 0x90 + (vblSlot << 1)); // ID device + if ((vbl & 0x010000FF) == 0x20) // CARRY clear == valid device IOCTL, 0x20 == mouse card ID + { + vm02.call((vblSlot << 16) | (17 << 19), 0x90 + (vblSlot << 1)); // MOUSECTL_UNVBL + break; + } + } + } + public static int slotMask() + { + return (1 << slot); + } + public static void update() + { + status = vm02.call(ctrlRead, mouseCtrl) & 0xFF; // CALL_FW ReadMouse + xPos = vm02.peekWord(addrXPos); + yPos = vm02.peekWord(addrYPos); + } +} diff --git a/src/makefile b/src/makefile index 0404c33..caa0a7d 100755 --- a/src/makefile +++ b/src/makefile @@ -30,6 +30,7 @@ SNDSEQ = rel/apple/SNDSEQ\#FE1000 PLAYSEQ = rel/apple/PLAYSEQ\#FE1000 SANITY = rel/SANITY\#FE1000 RPNCALC = rel/RPNCALC\#FE1000 +MOUSE = rel/apple/MOUSE\#FE1000 UTHERNET2 = rel/apple/UTHERNET2\#FE1000 UTHERNET = rel/apple/UTHERNET\#FE1000 ETHERIP = rel/ETHERIP\#FE1000 @@ -76,7 +77,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) -rm vmsrc/plvmzp.inc c64: $(PLVMZP_C64) $(PLASM) $(PLVM) $(PLVMC64) @@ -265,6 +266,10 @@ $(TFTPD): samplesrc/tftpd.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/tftpd.pla > samplesrc/tftpd.a acme --setpc 4094 -o $(TFTPD) samplesrc/tftpd.a +$(MOUSE): libsrc/apple/mouse.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/mouse.pla > libsrc/apple/mouse.a + acme --setpc 4094 -o $(MOUSE) libsrc/apple/mouse.a + $(UTHERNET): libsrc/apple/uthernet.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/apple/uthernet.pla > libsrc/apple/uthernet.a acme --setpc 4094 -o $(UTHERNET) libsrc/apple/uthernet.a diff --git a/src/mkrel b/src/mkrel index b9bc46e..e3ecce6 100755 --- a/src/mkrel +++ b/src/mkrel @@ -25,6 +25,7 @@ cp rel/SANE#FE1000 prodos/sys/SANE.REL cp rel/apple/SDFAT#FE1000 prodos/sys/SDFAT.REL cp rel/apple/SPIPORT#FE1000 prodos/sys/SPIPORT.REL cp rel/apple/SNDSEQ#FE1000 prodos/sys/SNDSEQ.REL +cp rel/apple/MOUSE#FE1000 prodos/sys/MOUSE.REL cp rel/apple/UTHERNET#FE1000 prodos/sys/UTHERNET.REL cp rel/apple/UTHERNET2#FE1000 prodos/sys/UTHERNET2.REL cp rel/apple/SOS#FE1000 prodos/sys/SOS.REL @@ -88,6 +89,7 @@ cp samplesrc/rogue.pla prodos/bld/ROGUE.PLA.TXT cp samplesrc/rogue.map.pla prodos/bld/ROGUE.MAP.PLA.TXT cp samplesrc/rogue.combat.pla prodos/bld/ROGUE.COMBAT.PLA.TXT cp samplesrc/gfxdemo.pla prodos/bld/GFXDEMO.PLA.TXT +cp samplesrc/mousetest.pla prodos/bld/MOUSETEST.PLA.TXT mkdir prodos/bld/inc cp inc/args.plh prodos/bld/inc/ARGS.PLH.TXT @@ -109,4 +111,5 @@ cp inc/sndseq.plh prodos/bld/inc/SNDSEQ.PLH.TXT cp inc/spiport.plh prodos/bld/inc/SPIPORT.PLH.TXT cp inc/testlib.plh prodos/bld/inc/TESTLIB.PLH.TXT cp inc/grafix.plh prodos/bld/inc/GRAFIX.PLH.TXT +cp inc/mouse.plh prodos/bld/inc/MOUSE.PLH.TXT cp vmsrc/apple/plvmzp.inc prodos/bld/inc/PLVMZP.INC.TXT diff --git a/src/samplesrc/mousetest.pla b/src/samplesrc/mousetest.pla new file mode 100644 index 0000000..610638d --- /dev/null +++ b/src/samplesrc/mousetest.pla @@ -0,0 +1,23 @@ +include "inc/cmdsys.plh" +include "inc/conio.plh" +include "inc/mouse.plh" + +var count +var xPos, yPos, bttn + +Mouse:clampMouse(0, 39, 0, 23) +//Mouse:setMouse(VBL_INT_ENABLE|MOVE_INT_ENABLE|BUTTON_INT_ENABLE|MOUSE_ENABLE) +Mouse:setMouse(MOVE_INT_ENABLE|BUTTON_INT_ENABLE|MOUSE_ENABLE) +while ^$C000 < 128 + if Mouse:chkMouse() + conio:gotoxy(xPos, yPos); putc(' ') + xPos, yPos, bttn = Mouse:readMouse()#3 + conio:gotoxy(xPos, yPos); putc(bttn & BUTTON_DOWN ?? '+' :: '^') + fin + if Mouse:chkVBL() + ^$400++ + fin +loop +getc +Mouse:detachMouse() +done diff --git a/src/vmsrc/apple/a1cmd.pla b/src/vmsrc/apple/a1cmd.pla index ef13b68..0f97f43 100755 --- a/src/vmsrc/apple/a1cmd.pla +++ b/src/vmsrc/apple/a1cmd.pla @@ -40,7 +40,7 @@ predef sext(a)#1, divmod(a,b)#2, execmod(modfile)#1 // // Exported CMDSYS table // -word version = $0111 // 01.11 +word version = $0120 // 01.20 word syspath word syscmdln word = @execmod diff --git a/src/vmsrc/apple/cmd.pla b/src/vmsrc/apple/cmd.pla index 99c6f57..564e921 100755 --- a/src/vmsrc/apple/cmd.pla +++ b/src/vmsrc/apple/cmd.pla @@ -37,7 +37,7 @@ predef execmod(modfile)#1 // // Exported CMDSYS table // -word version = $0111 // 01.11 +word version = $0120 // 01.20 word syspath word syscmdln word = @execmod diff --git a/src/vmsrc/apple/plvm02.s b/src/vmsrc/apple/plvm02.s index 9e58eac..e289b7d 100755 --- a/src/vmsrc/apple/plvm02.s +++ b/src/vmsrc/apple/plvm02.s @@ -1447,6 +1447,7 @@ ICALX LDA ESTKL,X PHP PLA STA PSR + SEI STA ALTRDON PLA STA IPH diff --git a/src/vmsrc/apple/soscmd.pla b/src/vmsrc/apple/soscmd.pla index 3796cce..35d1e95 100755 --- a/src/vmsrc/apple/soscmd.pla +++ b/src/vmsrc/apple/soscmd.pla @@ -29,7 +29,7 @@ predef execmod(modfile)#1 // // Exported CMDSYS table // -word version = $0111 // 01.11 +word version = $0120 // 01.20 word syspath word cmdlnptr word = @execmod