Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.sys.apple2.programmer > #1227 > unrolled thread

Multitasking Mouse Draw Demo v1.2

Started byD. Finnigan <dog_cow@macgui.com>
First post2014-06-10 00:52 +0000
Last post2014-06-10 20:07 +0000
Articles 3 — 2 participants

Back to article view | Back to comp.sys.apple2.programmer


Contents

  Multitasking Mouse Draw Demo v1.2 D. Finnigan <dog_cow@macgui.com> - 2014-06-10 00:52 +0000
    Multitasking Mouse Draw Demo v1.2 Changes D. Finnigan <dog_cow@macgui.com> - 2014-06-10 00:53 +0000
      Re: Multitasking Mouse Draw Demo v1.2 Changes D Finnigan <dog_cow@macgui.com> - 2014-06-10 20:07 +0000

#1227 — Multitasking Mouse Draw Demo v1.2

FromD. Finnigan <dog_cow@macgui.com>
Date2014-06-10 00:52 +0000
SubjectMultitasking Mouse Draw Demo v1.2
Message-ID<multitasking-mouse-draw-demo-v1.2-06jun14@macgui.com>
Multitasking Mouse Draw Demo v1.2 - 06 June 2014
by D. Finnigan

The source code is in the public domain for the benefit of all
Apple II users. I claim absolutely no copyright on the source code.


The assembler used is Merlin.



                1    KBD      EQU   $C000      
                2    KBDSTRB  EQU   $C010      
                3    SPKR     EQU   $C030      
                4    PRBYTE   EQU   $FDDA      
                5    PRNTAX   EQU   $F941      
                6    DOSWARM  EQU   $3D0       
                7    IRQLOC   EQU   $3FE       
                8    COUT     EQU   $FDED      
                9    VBLINT   EQU   $09        
                10   MOUIDLOC1 EQU  $05        ; LOCATIONS OF MOUSE ID BYTES 
                11   MOUIDLOC2 EQU  $07        
                12   MOUIDLOC3 EQU  $0B        
                13   MOUIDLOC4 EQU  $0C        
                14   MOUIDLOC5 EQU  $FB        
                15   MOUID1   EQU   $38        ; MOUSE ID BYTES 
                16   MOUID2   EQU   $18        
                17   MOUID3   EQU   $01        
                18   MOUID4   EQU   $20        
                19   MOUID5   EQU   $D6        
                20   BASEADDR EQU   $06        ; 2-BYTES FOR INDEXED ADDRESSING 
                21   MOUSLOT  EQU   $08        ; MOUSE CARD SLOT 
                22   CTR      EQU   $09        ; IRQ COUNTER 
                23   ACT      EQU   $19        ; ACTIVE PROCESS 
                24   NEWPROCTMP EQU $0A        ; TEMP HOLDER FOR NEW PROCESS ID 
                25   MAXP     EQU   $06        ; MAXIMUM NUMBER OF PROCESSES 
                26   MOUXPOS  EQU   $1A        ; 2 BYTES FOR MOUSE X-POSITION 
                27   MOUYPOS  EQU   $1C        
                28   MOUSTAT  EQU   $1E        
                29   * 
                30   PFREE    EQU   $FF        ; PROCESS SLOT FREE - CHANGE WITH CARE 
                31   PRUN     EQU   $01        ; RUNNING PROCESS 
                32   PZOMB    EQU   $02        ; ZOMBIE PROCESS 
                33   PSLEEP   EQU   $03        ; SLEEPING PROCESS 
                34   * 
                35   CLRTOP   EQU   $F836      
                36   SETCOL   EQU   $F864      
                37   PLOT     EQU   $F800      
                38   SCRN     EQU   $F871      
                39   GR       EQU   $C050      
                40   MIX      EQU   $C053      
                41   RED      EQU   $01        
                42   BLUE     EQU   $02        
                43   BLACK    EQU   $00        
                44   WHITE    EQU   $0F        
                45   * 
8000: A9 9B     46            LDA   #$9B       
8002: 20 ED FD  47            JSR   COUT       
8005: A9 91     48            LDA   #$91       ; KILL 80-COLS FIRMWARE 
8007: 20 ED FD  49            JSR   COUT       
800A: A2 14     50            LDX   #$14       
800C: 86 22     51            STX   $22        ; TOP OF TEXT WINDOW 
800E: CA        52            DEX              
800F: 86 25     53            STX   $25        
                54   * 
8011: A9 00     55   FINDMOUSE LDA  #$00       
8013: 85 06     56            STA   BASEADDR   
8015: A9 C8     57            LDA   #$C8       
8017: 85 07     58            STA   BASEADDR+1 
 
 
                              ===== Page 2 ===== 
 
8019: A2 08     59            LDX   #$08       
801B: CA        60   :LOOP1   DEX              
801C: F0 42     61            BEQ   :NOMOUSE   
801E: C6 07     62            DEC   BASEADDR+1 
8020: A0 05     63            LDY   #MOUIDLOC1 
8022: B1 06     64            LDA   (BASEADDR),Y 
8024: C9 38     65            CMP   #MOUID1    
8026: D0 F3     66            BNE   :LOOP1     
8028: A0 07     67            LDY   #MOUIDLOC2 
802A: B1 06     68            LDA   (BASEADDR),Y 
802C: C9 18     69            CMP   #MOUID2    
802E: D0 EB     70            BNE   :LOOP1     
8030: A0 0B     71            LDY   #MOUIDLOC3 
8032: B1 06     72            LDA   (BASEADDR),Y 
8034: C9 01     73            CMP   #MOUID3    
8036: D0 E3     74            BNE   :LOOP1     
8038: A0 0C     75            LDY   #MOUIDLOC4 
803A: B1 06     76            LDA   (BASEADDR),Y 
803C: C9 20     77            CMP   #MOUID4    
803E: D0 DB     78            BNE   :LOOP1     
8040: A0 FB     79            LDY   #MOUIDLOC5 
8042: B1 06     80            LDA   (BASEADDR),Y 
8044: C9 D6     81            CMP   #MOUID5    
8046: D0 D3     82            BNE   :LOOP1     
8048: 8A        83            TXA              
8049: 0A        84            ASL              
804A: 0A        85            ASL              
804B: 0A        86            ASL              
804C: 0A        87            ASL              
804D: 85 08     88            STA   MOUSLOT    
804F: A9 8D     89            LDA   #$8D       
8051: 20 ED FD  90            JSR   COUT       
8054: 8A        91            TXA              
8055: 20 DA FD  92            JSR   PRBYTE     
8058: A9 8D     93            LDA   #$8D       
805A: 20 ED FD  94            JSR   COUT       
805D: 4C 7B 80  95            JMP   SYSINIT    ; SYSTEM INITIALIZATION 
8060: A0 00     96   :NOMOUSE LDY   #$00       
8062: B9 70 80  97   :LOOP    LDA   NOMOUMSG,Y 
8065: F0 06     98            BEQ   :DONE      
8067: 20 ED FD  99            JSR   COUT       
806A: C8        100           INY              
806B: D0 F5     101           BNE   :LOOP      
806D: 4C D0 03  102  :DONE    JMP   DOSWARM    
8070: 8D CE CF  103  NOMOUMSG HEX   8DCECFA0CDCFD5D3C58D00 
8073: A0 CD CF D5 D3 C5 8D 00 
                104  * 
807B: 58        105  SYSINIT  CLI              ; CREATE INITIAL PROCESS 0 
807C: 08        106           PHP              
807D: 78        107           SEI              
807E: A9 FF     108           LDA   #PFREE     
8080: 8D BE 82  109           STA   STKTAB     
8083: 85 19     110           STA   ACT        
8085: A0 05     111           LDY   #MAXP-1    ; CLEAR PROCESS TABLES 
8087: 99 D7 82  112  :L1      STA   PSTATTAB,Y 
808A: 99 DD 82  113           STA   ESTATTAB,Y 
808D: 99 D1 82  114           STA   PPIDTAB,Y  
 
 
                              ===== Page 3 ===== 
 
8090: 88        115           DEY              
8091: 10 F4     116           BPL   :L1        
8093: A0 16     117           LDY   #$16       ; PRIORITY IN Y-REG 
8095: A9 9D     118           LDA   #<PROC0    
8097: A2 83     119           LDX   #>PROC0    
8099: 20 A3 80  120           JSR   NEWPROC    
809C: 20 0C 81  121           JSR   VBLON      ; ENABLE MOUSE CARD VBL INTERRUPTS 
809F: 28        122           PLP              ; ENABLE IRQ 
80A0: 4C A0 80  123  :IDLE    JMP   :IDLE      
                124  * 
                125  * CREATE A NEW PROCESS IN THE SYSTEM 
                126  * THIS MUST BE CALLED DIRECTLY UNTIL FORK AND EXEC 
                127  * CALLS ARE ADDED. 
                128  * Y-REG = PROCESS PRIORITY 
                129  * A-REG = LOW BYTE OF STARTING ADDRESS 
                130  * X-REG = HIGH BYTE OF "" "" 
                131  * 
                132  * RETURNS WITH NEW PROCESS ID IN Y-REG 
                133  * 
80A3: 08        134  NEWPROC  PHP              
80A4: 78        135           SEI              
80A5: 48        136           PHA              
80A6: 8A        137           TXA              
80A7: 48        138           PHA              
80A8: 98        139           TYA              
80A9: 48        140           PHA              
80AA: A0 00     141           LDY   #$00       ; FIND A FREE PROCESS ID 
80AC: B9 D7 82  142  :L1      LDA   PSTATTAB,Y ; CHECK PROCESS STATUS 
80AF: C9 FF     143           CMP   #PFREE     ; IS IT FREE? 
80B1: F0 08     144           BEQ   :FREE      ; YES! 
80B3: C8        145           INY              ; NO, SO MOVE ON TO NEXT ONE 
80B4: C0 06     146           CPY   #MAXP      ; REACHED OUR LIMIT? 
80B6: D0 F4     147           BNE   :L1        ; NO, SO CARRY ON 
80B8: 38        148           SEC              ; ERROR, NO FREE PROCESS SLOTS 
80B9: B0 50     149           BCS   :DONE      ; EXIT WITH ERROR CONDITION 
80BB: EE BE 82  150  :FREE    INC   STKTAB     ; INCREMENT PROCESS COUNT 
80BE: 84 0A     151           STY   NEWPROCTMP 
80C0: F0 0F     152           BEQ   :TSX       ; OFFSET FROM CURRENT SP 
80C2: 88        153           DEY              ; OFFSET FROM LAST PROC SP 
80C3: C4 19     154           CPY   ACT        ; CURRENT PROCESS? 
80C5: F0 0A     155           BEQ   :TSX       
80C7: BE BF 82  156           LDX   STKTAB+1,Y 
80CA: 8A        157           TXA              
80CB: 38        158           SEC              
80CC: E9 20     159           SBC   #$20       ; NEW PROC SP 
80CE: C8        160           INY              
80CF: D0 07     161           BNE   :STORSP    
80D1: BA        162  :TSX     TSX              
80D2: 8A        163           TXA              
80D3: 38        164           SEC              
80D4: E9 20     165           SBC   #$20       
80D6: A4 0A     166           LDY   NEWPROCTMP ; RELOAD NEW PROCESS ID 
80D8: AA        167  :STORSP  TAX              
80D9: 99 BF 82  168           STA   STKTAB+1,Y 
80DC: 68        169           PLA              ; PROCESS PRIORITY 
80DD: 99 C5 82  170           STA   PRIOTAB,Y  
 
 
                              ===== Page 4 ===== 
 
80E0: 68        171           PLA              ; HI-BYTE OF START ADDR 
80E1: 9D 00 01  172           STA   $0100,X    
80E4: CA        173           DEX              
80E5: 68        174           PLA              ; LO-BYTE OF START ADDR 
80E6: 9D 00 01  175           STA   $0100,X    
80E9: A9 00     176           LDA   #$00       ; INITIAL PROCESSOR STATUS 
80EB: CA        177           DEX              
80EC: 9D 00 01  178           STA   $0100,X    
80EF: CA        179           DEX              
80F0: 9D 00 01  180           STA   $0100,X    ; INITIAL REGISTERS 
80F3: CA        181           DEX              
80F4: 9D 00 01  182           STA   $0100,X    
80F7: CA        183           DEX              
80F8: 9D 00 01  184           STA   $0100,X    
80FB: CA        185           DEX              
80FC: 8A        186           TXA              
80FD: 99 BF 82  187           STA   STKTAB+1,Y 
8100: A5 19     188           LDA   ACT        ; GET PARENT PROCESS ID 
8102: 99 D1 82  189           STA   PPIDTAB,Y  ; STORE IN PPID TABLE 
8105: A9 01     190           LDA   #PRUN      ; PROCESS STATUS 
8107: 99 D7 82  191           STA   PSTATTAB,Y 
810A: 28        192           PLP              
810B: 60        193  :DONE    RTS              
                194  * 
810C: A9 01     195  VBLON    LDA   #$01       
810E: 20 30 81  196           JSR   SETMOUSE   
8111: 20 24 81  197           JSR   INITMOUSE  
8114: A9 32     198           LDA   #<IRQ      
8116: 8D FE 03  199           STA   IRQLOC     
8119: A9 82     200           LDA   #>IRQ      
811B: 8D FF 03  201           STA   IRQLOC+1   
811E: A9 09     202           LDA   #VBLINT    
8120: 20 30 81  203           JSR   SETMOUSE   ; TURN ON MOUSE VBL INTERRUPTS 
8123: 60        204           RTS              
                205  * 
8124: A0 19     206  INITMOUSE LDY  #$19       
8126: A9 00     207           LDA   #$00       
8128: 85 06     208           STA   BASEADDR   
812A: B1 06     209           LDA   (BASEADDR),Y 
812C: 85 06     210           STA   BASEADDR   
812E: D0 3E     211           BNE   MOUSEJMP   
                212  * 
8130: A0 12     213  SETMOUSE LDY   #$12       
8132: AA        214           TAX              
8133: A9 00     215           LDA   #$00       
8135: 85 06     216           STA   BASEADDR   
8137: B1 06     217           LDA   (BASEADDR),Y 
8139: 85 06     218           STA   BASEADDR   
813B: 8A        219           TXA              
813C: 10 30     220           BPL   MOUSEJMP   
                221  * 
813E: A0 13     222  SERVEMOUSE LDY #$13       
8140: A9 00     223           LDA   #$00       
8142: 85 06     224           STA   BASEADDR   
8144: B1 06     225           LDA   (BASEADDR),Y 
8146: 85 06     226           STA   BASEADDR   
8148: D0 24     227           BNE   MOUSEJMP   
 
 
                              ===== Page 5 ===== 
 
                228  * 
814A: AA        229  CLAMPMOUSE TAX            
814B: A0 17     230           LDY   #$17       
814D: A9 00     231           LDA   #$00       
814F: 85 06     232           STA   BASEADDR   
8151: B1 06     233           LDA   (BASEADDR),Y 
8153: 85 06     234           STA   BASEADDR   
8155: 8A        235           TXA              
8156: 10 16     236           BPL   MOUSEJMP   
                237  * 
8158: A0 18     238  HOMEMOUSE LDY  #$18       
815A: A9 00     239           LDA   #$00       
815C: 85 06     240           STA   BASEADDR   
815E: B1 06     241           LDA   (BASEADDR),Y 
8160: 85 06     242           STA   BASEADDR   
8162: D0 0A     243           BNE   MOUSEJMP   
                244  * 
8164: A0 14     245  READMOUSE LDY  #$14       
8166: A9 00     246           LDA   #$00       
8168: 85 06     247           STA   BASEADDR   
816A: B1 06     248           LDA   (BASEADDR),Y 
816C: 85 06     249           STA   BASEADDR   
                250  * 
816E: A6 07     251  MOUSEJMP LDX   BASEADDR+1 
8170: A4 08     252           LDY   MOUSLOT    
8172: 6C 06 00  253           JMP   (BASEADDR) 
                254  * 
                255  * TERMINATE A PROCESS AND RETURN A STATUS CODE 
                256  * TO THE PARENT PROCESS 
                257  * A-REG HOLDS THE STATUS CODE 
                258  * 
8175: A4 19     259  EXIT     LDY   ACT        ; GET PROCESS ID 
8177: 99 DD 82  260           STA   ESTATTAB,Y ; STORE EXIT STATUS 
817A: A9 02     261           LDA   #PZOMB     
817C: 99 D7 82  262           STA   PSTATTAB,Y ; BECOME A ZOMBIE 
817F: A2 00     263           LDX   #$00       ; USED AS ANY CHILD FOUND FLAG 
8181: A4 19     264  :L0      LDY   ACT        ; SEARCH PROCESS TABLE FOR OUR PARENT 
8183: B9 D1 82  265           LDA   PPIDTAB,Y  ; GET OUR PARENT PROCESS ID 
8186: C9 FF     266           CMP   #PFREE     ; CHECK IF THE PROCESS STILL EXISTS 
8188: F0 22     267           BEQ   :NOPARENT  ; NO PARENT PROCESS 
818A: 98        268  :PARENT  TYA              ; FOUND PARENT; SAVE ITS PID 
818B: 48        269           PHA              
818C: A0 01     270           LDY   #$01       ; PROCESS 1 (INIT) 
818E: 20 EF 81  271           JSR   WAKEUP     
8191: 68        272           PLA              
8192: A8        273           TAY              ; RESTORE SAVED PID 
8193: 20 EF 81  274           JSR   WAKEUP     ; NOW WAKE UP THE PARENT PROCESS 
                275  * SEARCH FOR CHILDREN 
8196: A0 00     276           LDY   #$00       ; INITIALIZE PROCESS ID FOR LOOP 
8198: B9 D1 82  277  :CL1     LDA   PPIDTAB,Y  ; GET THE PARENT PROCESS ID 
819B: C5 19     278           CMP   ACT        ; IS IT OUR PROCESS ID? 
819D: D0 05     279           BNE   :CNEXT     ; NO, SO MOVE ON 
819F: A9 01     280           LDA   #$01       ; NEW PARENT PID IS 1 (INIT) 
81A1: 99 D1 82  281           STA   PPIDTAB,Y  ; SET THE NEW PPID 
                282  * TODO: CHECK FOR STOPPED PROCESS 
 
 
                              ===== Page 6 ===== 
 
81A4: C8        283  :CNEXT   INY              ; POINT TO NEXT PROCESS ID 
81A5: C9 06     284           CMP   #MAXP      ; AT PROCESS LIMIT? 
81A7: D0 EF     285           BNE   :CL1       ; NO, SO CONTINUE 
81A9: 4C 73 82  286           JMP   RESETCTR   ; RUN NEXT PROCESS 
81AC: A9 01     287  :NOPARENT LDA  #$01       ; PARENT IS NOW PID 1 (INIT) 
81AE: 99 D1 82  288           STA   PPIDTAB,Y  ; UPDATE OUR PROCESS PARENT 
81B1: D0 CE     289           BNE   :L0        ; DO THE PARENT CHECK AGAIN (ALWAYS TAKEN) 
                290  * 
                291  * WAIT FOREVER FOR A CHILD PROCESS TO TERMINATE 
                292  * AND COLLECT ITS TERMINATION STATUS 
                293  * A-REG = TERMINATION STATUS 
                294  * Y-REG = CHILD PROCESS ID 
                295  * CARRY SET = ERROR: NO CHILD PROCESSES EXIST 
                296  * 
81B3: A2 00     297  WAIT     LDX   #$00       ; USED AS ANY CHILD FOUND FLAG 
81B5: A0 00     298  :L1      LDY   #00        ; SEARCH PROCESS TABLE FOR OUR CHILDREN 
81B7: B9 D1 82  299  :L2      LDA   PPIDTAB,Y  ; GET CHILD STATUS 
81BA: C5 19     300           CMP   ACT        ; OUR CHILD? 
81BC: D0 08     301           BNE   :NEXT      ; NO 
81BE: E8        302           INX              ; FOUND AT LEAST ONE CHILD 
81BF: B9 D7 82  303           LDA   PSTATTAB,Y ; GET PROCESS STATUS 
81C2: C9 02     304           CMP   #PZOMB     ; IS A ZOMBIE? 
81C4: F0 10     305           BEQ   :COLL      ; YES, SO COLLECT STATUS 
81C6: C8        306  :NEXT    INY              
81C7: C0 06     307           CPY   #MAXP      ; SEARCHED THE ENTIRE PROCESS TABLE? 
81C9: D0 EC     308           BNE   :L2        
81CB: 8A        309           TXA              ; CHECK OUR CHILD FLAG 
81CC: F0 1D     310           BEQ   :NOCHILD   ; NO CHILDREN, SO RETURN ERROR 
81CE: A0 7F     311           LDY   #$7F       ; SLEEP TIME 
81D0: 20 00 82  312           JSR   SLEEP      ; GO TO SLEEP 
81D3: 4C B5 81  313           JMP   :L1        ; LOOK FOR CHILDREN AGAIN 
81D6: B9 DD 82  314  :COLL    LDA   ESTATTAB,Y ; EXIT STATUS OF CHILD PROCESS 
81D9: 48        315           PHA              
81DA: A9 FF     316           LDA   #PFREE     ; CLEAR PROCESS SLOT 
81DC: 99 D7 82  317           STA   PSTATTAB,Y 
81DF: 99 D1 82  318           STA   PPIDTAB,Y  
81E2: 99 DD 82  319           STA   ESTATTAB,Y 
81E5: CE BE 82  320           DEC   STKTAB     ; DECREMENT PROCESS COUNT 
81E8: 68        321           PLA              ; GET EXIT STATUS BACK 
81E9: 18        322           CLC              ; NO ERROR 
81EA: 60        323           RTS              
81EB: 68        324  :NOCHILD PLA              
81EC: AA        325           TAX              
81ED: 38        326           SEC              ; ERROR FLAG 
81EE: 60        327           RTS              
                328  * 
                329  * FORCIBLY WAKE A SLEEPING PROCESS 
                330  * IF PROCESS IS NOT ASLEEP, NOTHING HAPPENS 
                331  * Y-REG HOLDS PROCESS ID 
                332  * 
81EF: C0 06     333  WAKEUP   CPY   #MAXP      
81F1: F0 0C     334           BEQ   :DONE      ; OVER LIMIT 
81F3: B9 D7 82  335           LDA   PSTATTAB,Y ; GET PROCESS STATUS 
81F6: C9 03     336           CMP   #PSLEEP    ; IS IT SLEEPING? 
 
 
                              ===== Page 7 ===== 
 
81F8: D0 05     337           BNE   :DONE      ; NO, SO EXIT NOW 
81FA: A9 01     338           LDA   #PRUN      ; RUN STATUS 
81FC: 99 D7 82  339           STA   PSTATTAB,Y ; SET NEW STATUS 
81FF: 60        340  :DONE    RTS              
                341  * 
                342  * PUT A PROCESS TO SLEEP FOR A TIME 
                343  * Y-REG HOLDS SLEEPING TIME 
                344  * 
8200: 08        345  SLEEP    PHP              
8201: 78        346           SEI              
8202: 48        347           PHA              
8203: 8A        348           TXA              
8204: 48        349           PHA              
8205: 98        350           TYA              
8206: 48        351           PHA              
8207: A4 19     352           LDY   ACT        
8209: BA        353           TSX              
820A: E8        354           INX              
820B: E8        355           INX              
820C: E8        356           INX              
820D: BD 00 01  357           LDA   $0100,X    
8210: 99 CB 82  358           STA   SLPTAB,Y   ; STORE SLEEP DURATION 
8213: A9 03     359           LDA   #PSLEEP    
8215: 99 D7 82  360           STA   PSTATTAB,Y ; SET PROCESS STATUS TO SLEEPING 
8218: D0 07     361           BNE   YIELD2     ; ALWAYS TAKEN 
                362  * 
                363  * GIVE UP REMAINING CPU TIME FOR THIS PROCESS 
                364  * 
821A: 08        365  YIELD    PHP              
821B: 78        366           SEI              
821C: 48        367           PHA              
821D: 8A        368           TXA              
821E: 48        369           PHA              
821F: 98        370           TYA              
8220: 48        371           PHA              
8221: BA        372  YIELD2   TSX              ; FIX JSR RETURN FOR RTI 
8222: 8A        373           TXA              
8223: 18        374           CLC              
8224: 69 05     375           ADC   #$05       
8226: AA        376           TAX              
8227: FE 00 01  377           INC   $0100,X    
822A: D0 47     378           BNE   RESETCTR   
822C: E8        379           INX              
822D: FE 00 01  380           INC   $0100,X    
8230: D0 41     381           BNE   RESETCTR   
                382  * 
                383  * THE MAIN INTERRUPT HANDLER 
                384  * 
8232: A5 45     385  IRQ      LDA   $45        
8234: 48        386           PHA              
8235: 8A        387           TXA              
8236: 48        388           PHA              
8237: 98        389           TYA              
8238: 48        390           PHA              
8239: 20 3E 81  391           JSR   SERVEMOUSE 
823C: B0 7A     392           BCS   IRQDONE    
823E: 20 64 81  393           JSR   READMOUSE  
 
 
                              ===== Page 8 ===== 
 
8241: A5 07     394           LDA   BASEADDR+1 
8243: 29 0F     395           AND   #$F        
8245: AA        396           TAX              
8246: BD 78 04  397           LDA   $478,X     
8249: 85 1A     398           STA   MOUXPOS    
824B: BD F8 04  399           LDA   $4F8,X     
824E: 85 1C     400           STA   MOUYPOS    
8250: BD 78 05  401           LDA   $578,X     
8253: 85 1B     402           STA   MOUXPOS+1  
8255: BD F8 05  403           LDA   $5F8,X     
8258: 85 1D     404           STA   MOUYPOS+1  
825A: BD 78 07  405           LDA   $778,X     
825D: 85 1E     406           STA   MOUSTAT    
825F: A4 19     407           LDY   ACT        ; CURRENT PROCESS ID 
8261: 30 1B     408           BMI   IRQNEXT    ; BOOTSTRAP INITIAL PROCESS 
8263: AD BE 82  409           LDA   STKTAB     ; RUNNING PROCESS COUNT 
8266: F0 50     410           BEQ   IRQDONE    ; ONLY 1 PROCESS 
8268: A5 09     411  :CTR     LDA   CTR        
826A: D9 C5 82  412           CMP   PRIOTAB,Y  ; HAS PROCESS REACHED ITS TIME LIMIT? 
826D: F0 04     413           BEQ   RESETCTR   ; YES, SO PREPARE TO SWITCH 
826F: E6 09     414           INC   CTR        
8271: D0 45     415           BNE   IRQDONE    ; PROCESS NOT SWITCHED 
8273: A9 00     416  RESETCTR LDA   #$00       
8275: 85 09     417           STA   CTR        
8277: A4 19     418           LDY   ACT        
8279: BA        419           TSX              
827A: 8A        420           TXA              
827B: 99 BF 82  421           STA   STKTAB+1,Y 
827E: C8        422  IRQNEXT  INY              ; SWITCH TO NEXT PROCESS 
827F: C0 06     423           CPY   #MAXP      
8281: F0 13     424           BEQ   :L2        ; GO BACK TO START OF PROCESS TABLE 
8283: B9 D7 82  425  :L1      LDA   PSTATTAB,Y ; GET PRCESS STATUS 
8286: C9 01     426           CMP   #PRUN      ; IS THIS A RUNNABLE PROCESS? 
8288: F0 22     427           BEQ   :CTXSW     ; YES, SO SWITCH IT IN 
828A: C9 FF     428           CMP   #PFREE     ; IS THIS PROCESS SLOT ACTIVE? 
828C: F0 F0     429           BEQ   IRQNEXT    ; YES, SO SKIP IT 
828E: C9 03     430           CMP   #PSLEEP    ; IS PROCESS ASLEEP? 
8290: F0 08     431           BEQ   :SLEEP     ; YES, SO DECREMENT ITS SLEEP TIMER 
8292: C9 02     432           CMP   #PZOMB     ; IS THIS PROCESS A ZOMBIE? 
8294: F0 E8     433           BEQ   IRQNEXT    ; YES, SO SKIP IT 
8296: A0 00     434  :L2      LDY   #$00       ; LOOP BACK TO PROCESS 0 
8298: F0 E9     435           BEQ   :L1        ; ALWAYS TAKEN 
829A: B9 CB 82  436  :SLEEP   LDA   SLPTAB,Y   
829D: F0 0D     437           BEQ   :CTXSW     ; PROCESS IS NOT ASLEEP 
829F: AA        438           TAX              
82A0: CA        439           DEX              
82A1: 8A        440           TXA              
82A2: 99 CB 82  441           STA   SLPTAB,Y   
82A5: D0 D7     442           BNE   IRQNEXT    ; PROCESS STILL HAS SLEEP TIME 
82A7: A9 01     443           LDA   #PRUN      ; PROCESS IS NOW RUNNABLE 
82A9: 99 D7 82  444           STA   PSTATTAB,Y ; SET THIS NEW STATUS 
82AC: BE BF 82  445  :CTXSW   LDX   STKTAB+1,Y 
82AF: 9A        446           TXS              ; RESTORE THE PROCESS STACK POINTER 
 
 
                              ===== Page 9 ===== 
 
82B0: 84 19     447           STY   ACT        ; ACTIVE PROCESS ID 
82B2: AD 30 C0  448           LDA   SPKR       
82B5: AD 30 C0  449           LDA   SPKR       
82B8: 68        450  IRQDONE  PLA              
82B9: A8        451           TAY              
82BA: 68        452           PLA              
82BB: AA        453           TAX              
82BC: 68        454           PLA              
82BD: 40        455           RTI              
                456  * 
82BE: 00 00 00  457  STKTAB   DS    MAXP+1     
82C1: 00 00 00 00 
82C5: 00 00 00  458  PRIOTAB  DS    MAXP       ; PROCESS PRIORITIES TABLE 
82C8: 00 00 00 
82CB: 00 00 00  459  SLPTAB   DS    MAXP       ; SLEEPING PROCESSES TABLE 
82CE: 00 00 00 
82D1: 00 00 00  460  PPIDTAB  DS    MAXP       ; PARENT PROCESS ID TABLE 
82D4: 00 00 00 
82D7: 00 00 00  461  PSTATTAB DS    MAXP       ; PROCESS STATUS TABLE 
82DA: 00 00 00 
82DD: 00 00 00  462  ESTATTAB DS    MAXP       ; PROCESS EXIT STATUS TABLE 
82E0: 00 00 00 
                463  * 
82E3: 2C 10 C0  464  PROC4    BIT   KBDSTRB    
82E6: A0 00     465           LDY   #$00       
82E8: A2 00     466           LDX   #$00       
82EA: 8A        467  :L1      TXA              
82EB: 08        468           PHP              
82EC: 78        469           SEI              
82ED: 20 71 F8  470           JSR   SCRN       
82F0: 28        471           PLP              
82F1: 48        472           PHA              
82F2: 68        473           PLA              
82F3: C9 0F     474           CMP   #WHITE     
82F5: D0 0C     475           BNE   :L2        
82F7: A9 00     476           LDA   #BLACK     
82F9: 08        477           PHP              
82FA: 78        478           SEI              
82FB: 20 64 F8  479           JSR   SETCOL     
82FE: 8A        480           TXA              ; VERTICAL POSITION IN A-REG 
82FF: 20 00 F8  481           JSR   PLOT       
8302: 28        482           PLP              
8303: C8        483  :L2      INY              
8304: C0 28     484           CPY   #$28       
8306: D0 E2     485           BNE   :L1        
8308: A0 00     486           LDY   #$00       
830A: E8        487           INX              
830B: E0 28     488           CPX   #$28       
830D: D0 DB     489           BNE   :L1        
830F: A0 00     490           LDY   #$00       
8311: B9 26 83  491  :MSGL    LDA   CLRMSG,Y   
8314: F0 0B     492           BEQ   :MSGDONE   
8316: 09 80     493           ORA   #$80       
8318: 08        494           PHP              
8319: 78        495           SEI              
831A: 20 ED FD  496           JSR   COUT       
831D: 28        497           PLP              
 
 
                              ===== Page 10 ===== 
 
831E: C8        498           INY              
831F: D0 F0     499           BNE   :MSGL      
8321: A9 01     500  :MSGDONE LDA   #$01       ; EXIT CODE 
8323: 20 75 81  501           JSR   EXIT       ; TERMINATE THIS PROCESS 
8326: 43 4C 45  502  CLRMSG   ASC   B4CLEARB4 
8329: 41 52 
832B: 8D 00     503           HEX   8D00       
832D: A5 1E     504  PROC3    LDA   MOUSTAT    
832F: 10 17     505           BPL   :NEXT      
8331: A5 1A     506           LDA   MOUXPOS    
8333: 08        507           PHP              
8334: 78        508           SEI              
8335: 20 DA FD  509           JSR   PRBYTE     
8338: A9 A0     510           LDA   #$A0       
833A: 20 ED FD  511           JSR   COUT       
833D: A5 1C     512           LDA   MOUYPOS    
833F: 20 DA FD  513           JSR   PRBYTE     
8342: A9 8D     514           LDA   #$8D       
8344: 20 ED FD  515           JSR   COUT       
8347: 28        516           PLP              
8348: 20 1A 82  517  :NEXT    JSR   YIELD      
834B: 4C 2D 83  518           JMP   PROC3      
                519  * 
834E: A2 27     520  PROC2    LDX   #$27       
8350: A0 27     521           LDY   #$27       
8352: A9 03     522           LDA   #$03       
8354: 20 00 82  523           JSR   SLEEP      
8357: 08        524  :L1      PHP              
8358: 78        525           SEI              
8359: A9 02     526           LDA   #BLUE      
835B: 20 64 F8  527           JSR   SETCOL     
835E: 8A        528           TXA              
835F: 20 00 F8  529           JSR   PLOT       
8362: 28        530           PLP              
8363: 20 1A 82  531           JSR   YIELD      
8366: 88        532           DEY              
8367: 10 EE     533           BPL   :L1        
8369: A0 27     534           LDY   #$27       
836B: CA        535           DEX              
836C: 10 E9     536           BPL   :L1        
836E: A2 27     537           LDX   #$27       
8370: D0 E5     538           BNE   :L1        
                539  * 
8372: A0 00     540  PROC1    LDY   #$00       
8374: A2 00     541           LDX   #$00       
8376: 08        542  :L1      PHP              
8377: 78        543           SEI              
8378: A9 01     544           LDA   #RED       
837A: 20 64 F8  545           JSR   SETCOL     
837D: 8A        546           TXA              
837E: 20 00 F8  547           JSR   PLOT       
8381: 28        548           PLP              
8382: 20 1A 82  549           JSR   YIELD      
8385: C8        550           INY              
8386: C0 28     551           CPY   #$28       
8388: D0 EC     552           BNE   :L1        
838A: A0 00     553           LDY   #$00       
 
 
                              ===== Page 11 ===== 
 
838C: A9 07     554           LDA   #$07       
838E: 20 00 82  555           JSR   SLEEP      
8391: E8        556           INX              
8392: E0 28     557           CPX   #$28       
8394: D0 E0     558           BNE   :L1        
8396: A2 00     559           LDX   #$00       
8398: F0 DC     560           BEQ   :L1        
839A: 4C 72 83  561           JMP   PROC1      
                562  * 
839D: 08        563  PROC0    PHP              
839E: 78        564           SEI              
839F: A9 00     565           LDA   #$00       
83A1: A2 27     566           LDX   #$27       ; MAX X CLAMP 
83A3: 8D 78 04  567           STA   $478       
83A6: 8E F8 04  568           STX   $4F8       
83A9: 8D 78 05  569           STA   $578       
83AC: 8D F8 05  570           STA   $5F8       
83AF: 20 4A 81  571           JSR   CLAMPMOUSE 
83B2: A0 00     572           LDY   #$00       
83B4: A9 01     573           LDA   #$01       
83B6: A2 27     574           LDX   #$27       
83B8: 8C 78 04  575           STY   $478       
83BB: 8E F8 04  576           STX   $4F8       
83BE: 8C 78 05  577           STY   $578       
83C1: 8C F8 05  578           STY   $5F8       
83C4: 20 4A 81  579           JSR   CLAMPMOUSE 
83C7: 20 58 81  580           JSR   HOMEMOUSE  
83CA: 28        581           PLP              
83CB: AD 53 C0  582           LDA   MIX        
83CE: AD 50 C0  583           LDA   GR         
83D1: 08        584           PHP              
83D2: 78        585           SEI              
83D3: 20 36 F8  586           JSR   CLRTOP     
83D6: 28        587           PLP              
83D7: A0 0B     588           LDY   #$0B       ; PROCESS PRIORITY 
83D9: A9 72     589           LDA   #<PROC1    
83DB: A2 83     590           LDX   #>PROC1    
83DD: 20 A3 80  591           JSR   NEWPROC    
83E0: A0 06     592           LDY   #$06       
83E2: A9 4E     593           LDA   #<PROC2    
83E4: A2 83     594           LDX   #>PROC2    
83E6: 20 A3 80  595           JSR   NEWPROC    
83E9: A0 0B     596           LDY   #$0B       
83EB: A9 2D     597           LDA   #<PROC3    
83ED: A2 83     598           LDX   #>PROC3    
83EF: 20 A3 80  599           JSR   NEWPROC    
83F2: 2C 00 C0  600  :NEXT    BIT   KBD        
83F5: 30 16     601           BMI   :CLRIT     
83F7: 08        602           PHP              
83F8: 78        603           SEI              
83F9: A5 1E     604           LDA   MOUSTAT    ; CHECK BUTTON STATUS 
83FB: 10 0C     605           BPL   :PULL      
83FD: A9 0F     606           LDA   #WHITE     
83FF: 20 64 F8  607           JSR   SETCOL     
8402: A5 1C     608           LDA   MOUYPOS    
8404: A4 1A     609           LDY   MOUXPOS    
8406: 20 00 F8  610           JSR   PLOT       
 
 
                              ===== Page 12 ===== 
 
8409: 28        611  :PULL    PLP              
840A: 4C F2 83  612           JMP   :NEXT      
840D: A0 04     613  :CLRIT   LDY   #$04       ; PROCESS PRIORITY 
840F: A9 E3     614           LDA   #<PROC4    
8411: A2 82     615           LDX   #>PROC4    
8413: 20 A3 80  616           JSR   NEWPROC    ; SPAWN THE CHILD PROCESS 
8416: 20 B3 81  617           JSR   WAIT       ; AND WAIT FOR IT TO COMPLETE 
8419: 08        618           PHP              
841A: 78        619           SEI              
841B: AA        620           TAX              ; MOVE TERM STATUS TO X-REG 
841C: 98        621           TYA              ; MOVE PROC ID TO A-REG 
841D: 20 41 F9  622           JSR   PRNTAX     
8420: A9 8D     623           LDA   #$8D       
8422: 20 ED FD  624           JSR   COUT       
8425: 28        625           PLP              
8426: 4C F2 83  626           JMP   :NEXT      
--End assembly, 1065 bytes, Errors: 0 
Symbol table - alphabetical order: 
   ACT     =$19        BASEADDR=$06        BLACK   =$00        BLUE    =$02 
   CLAMPMOUSE=$814A      CLRMSG  =$8326      CLRTOP  =$F836      COUT    =$FDED 
   CTR     =$09        DOSWARM =$03D0      ESTATTAB=$82DD      EXIT    =$8175 
?  FINDMOUSE=$8011      GR      =$C050      HOMEMOUSE=$8158      INITMOUSE=$8124 
   IRQ     =$8232      IRQDONE =$82B8      IRQLOC  =$03FE      IRQNEXT =$827E 
   KBD     =$C000      KBDSTRB =$C010      MAXP    =$06        MIX     =$C053 
   MOUID1  =$38        MOUID2  =$18        MOUID3  =$01        MOUID4  =$20 
   MOUID5  =$D6        MOUIDLOC1=$05        MOUIDLOC2=$07        MOUIDLOC3=$0B 
   MOUIDLOC4=$0C        MOUIDLOC5=$FB        MOUSEJMP=$816E      MOUSLOT =$08 
   MOUSTAT =$1E        MOUXPOS =$1A        MOUYPOS =$1C        NEWPROC =$80A3 
   NEWPROCTMP=$0A        NOMOUMSG=$8070      PFREE   =$FF        PLOT    =$F800 
   PPIDTAB =$82D1      PRBYTE  =$FDDA      PRIOTAB =$82C5      PRNTAX  =$F941 
   PROC0   =$839D      PROC1   =$8372      PROC2   =$834E      PROC3   =$832D 
   PROC4   =$82E3      PRUN    =$01        PSLEEP  =$03        PSTATTAB=$82D7 
   PZOMB   =$02        READMOUSE=$8164      RED     =$01        RESETCTR=$8273 
   SCRN    =$F871      SERVEMOUSE=$813E      SETCOL  =$F864      SETMOUSE=$8130 
   SLEEP   =$8200      SLPTAB  =$82CB      SPKR    =$C030      STKTAB  =$82BE 
   SYSINIT =$807B      VBLINT  =$09        VBLON   =$810C      WAIT    =$81B3 
   WAKEUP  =$81EF      WHITE   =$0F        YIELD   =$821A      YIELD2  =$8221 
Symbol table - numerical order: 
   BLACK   =$00        MOUID3  =$01        PRUN    =$01        RED     =$01 
   PZOMB   =$02        BLUE    =$02        PSLEEP  =$03        MOUIDLOC1=$05 
   BASEADDR=$06        MAXP    =$06        MOUIDLOC2=$07        MOUSLOT =$08 
   VBLINT  =$09        CTR     =$09        NEWPROCTMP=$0A        MOUIDLOC3=$0B 
   MOUIDLOC4=$0C        WHITE   =$0F        MOUID2  =$18        ACT     =$19 
   MOUXPOS =$1A        MOUYPOS =$1C        MOUSTAT =$1E        MOUID4  =$20 
   MOUID1  =$38        MOUID5  =$D6        MOUIDLOC5=$FB        PFREE   =$FF 
   DOSWARM =$03D0      IRQLOC  =$03FE   ?  FINDMOUSE=$8011      NOMOUMSG=$8070 
   SYSINIT =$807B      NEWPROC =$80A3      VBLON   =$810C      INITMOUSE=$8124 
   SETMOUSE=$8130      SERVEMOUSE=$813E      CLAMPMOUSE=$814A      HOMEMOUSE=$81 
 
 
                              ===== Page 13 ===== 
 58 
   READMOUSE=$8164      MOUSEJMP=$816E      EXIT    =$8175      WAIT    =$81B3 
   WAKEUP  =$81EF      SLEEP   =$8200      YIELD   =$821A      YIELD2  =$8221 
   IRQ     =$8232      RESETCTR=$8273      IRQNEXT =$827E      IRQDONE =$82B8 
   STKTAB  =$82BE      PRIOTAB =$82C5      SLPTAB  =$82CB      PPIDTAB =$82D1 
   PSTATTAB=$82D7      ESTATTAB=$82DD      PROC4   =$82E3      CLRMSG  =$8326 
   PROC3   =$832D      PROC2   =$834E      PROC1   =$8372      PROC0   =$839D 
   KBD     =$C000      KBDSTRB =$C010      SPKR    =$C030      GR      =$C050 
   MIX     =$C053      PLOT    =$F800      CLRTOP  =$F836      SETCOL  =$F864 
   SCRN    =$F871      PRNTAX  =$F941      PRBYTE  =$FDDA      COUT    =$FDED


== END ==

[toc] | [next] | [standalone]


#1228 — Multitasking Mouse Draw Demo v1.2 Changes

FromD. Finnigan <dog_cow@macgui.com>
Date2014-06-10 00:53 +0000
SubjectMultitasking Mouse Draw Demo v1.2 Changes
Message-ID<multitasking-mouse-draw-demo-changes-v1.2-06jun14@macgui.com>
In reply to#1227
Changes to system since version 1.1:

- Parent Process ID table
- Process status table
- Process exit status table
- CREATEALL renamed SYSINIT
- NEWPROC records process creation hierarchy: parent and child
- New WAIT system call allows a parent to collect the exit status of a child process
- New EXIT system call allows a process to terminate and return status to parent
- New WAKEUP system call allows a process to terminate a process's sleep status

Changes to processes since version 1.1:

- There are now 5 total processes
- New process 4 is called as a child process to clear white blocks
- Process 0 spawns process 4 and waits for it to terminate
- Process 0 prints the process ID and exit status of its child process


"The entire world is changing around them, and yet these user-land programs are completely unfazed." 

Most of the work for version 1.2 was completed around the first few days of March. Then I took a break from it until June.

[toc] | [prev] | [next] | [standalone]


#1230 — Re: Multitasking Mouse Draw Demo v1.2 Changes

FromD Finnigan <dog_cow@macgui.com>
Date2014-06-10 20:07 +0000
SubjectRe: Multitasking Mouse Draw Demo v1.2 Changes
Message-ID<dog_cow-1402430819@macgui.com>
In reply to#1228
As with last time, if you want a disk image with the source and binary, just
email me.

I am aware of some problems with the code. NEWPROC needs to be rewritten to
work with EXIT, because now processes can be created and destroyed out of
order, thus affecting the 6502 hardware stack. The EXIT syscall could also
use some cleanup. I left an LDX in there from a previous incarnation that I
had scrapped.

But since it runs my demo as it is, I let this stay. There are probably more
bugs to be uncovered.

These fixes and more to come in the next version. :-)

-- 
]DF$
Apple II Book: http://macgui.com/newa2guide/
Usenet: http://macgui.com/usenet/  <-- get posts by email!
Apple II Web & Blog hosting: http://a2hq.com/

[toc] | [prev] | [standalone]


Back to top | Article view | comp.sys.apple2.programmer


csiph-web