home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / pdoseric.hdv / SOURCE / OODRIVER.SRC.txt < prev    next >
Text File  |  2020-08-13  |  7KB  |  308 lines

  1. ; *** OBJECT ORIENTED DRIVER ***
  2. ;
  3. ;
  4.          ORG $2000
  5. ;
  6. OLDSTRT  EQU $3C   ;START ADRS FOR MOVE
  7. OLDEND   EQU $3E   ;END ADRS FOR MOVE
  8. NEWSTRT  EQU $42   ;DESTINATION FOR MOVE
  9. ;
  10. MOVE     EQU $FE2C ;MONITOR MOVE ROUTINE
  11. MLIALLOC EQU $BEF5 ;MLI MEMORY ALLOCATOR
  12. ;
  13. STACK    EQU $100
  14. PTR      EQU $06             ;FOR STEPPING THRU INLINE CODE
  15. ;
  16. ;
  17. ; *** RELOCATE THE OODRIVER TO HIGH MEMORY ***
  18. ;
  19. ; FILL OBJECT TABLE WITH ZEROES, THEN SET UP ENTRY FOR 'OSETUP' (OBJ #0)
  20. ; ADJUST OSETUP ENTRY IN THE OBJECT TABLE (WILL ALWAYS BE +7,+8)
  21. ; THEN ALLOCATE MEMORY AND MOVE THE WHOLE THING UP THERE
  22.          CLC
  23.          LDA #>OTABLE         ;GET PTR INTO OTABLE+8
  24.          ADC #$08
  25.          STA PTR
  26.          LDA #<OTABLE
  27.          ADC #$00
  28.          STA PTR+1
  29. ;
  30.          LDX #$FF
  31. WHAP0    LDY #$00
  32.          LDA #$00
  33. WHAP1    STA (PTR),Y
  34.          INY
  35.          CPY #$08
  36.          BNE WHAP1
  37.          CLC
  38.          LDA PTR   ;GET NEXT ADDRESS FOR ZEROING
  39.          ADC #$08
  40.          STA PTR
  41.          LDA PTR+1
  42.          ADC #$00
  43.          STA PTR+1        
  44.          DEX
  45.          BNE WHAP0
  46. ;
  47. ; CALCULATE NUMBER OF PAGES NEEDED
  48. ;
  49.          SEC
  50.          LDA #<EOF
  51.          SBC #<OODRIVER
  52.          CLC
  53.          ADC #$01            ;ONE EXTRA PAGE FOR MESSAGE PASSING
  54.          STA PAGES
  55. ;
  56.          LDA PAGES           ;ALLOCATE THE BLOCK
  57.          JSR MLIALLOC
  58.          BCS ALLOCERR
  59.          STA PTR+1           ;SAVE POINTER TO ALLOCATED MEMORY
  60.          INC PTR+1           ;ADD 1 TO ALLOW FOR MESSAGE PAGE
  61.          LDA #$00
  62.          STA PTR
  63. ;
  64. ; ZERO OUT THE MESSAGE PAGE
  65.          DEC PTR+1
  66.          LDY #$00
  67.          LDA #$00
  68. ZEROIT   STA (PTR),Y
  69.          INY
  70.          BNE ZEROIT
  71.          INC PTR+1
  72. ;
  73. ; ADJUST ADDRESS OF OSETUP IN OBJECT TABLE
  74. ;
  75.          SEC
  76.          LDA #>OSETUP
  77.          SBC #>OODRIVER
  78.          STA OTABLE+6
  79.          LDA #<OSETUP
  80.          SBC #<OODRIVER
  81.          STA OTABLE+7
  82.          CLC
  83.          LDA OTABLE+6
  84.          ADC PTR
  85.          STA OTABLE+6
  86.          LDA OTABLE+7
  87.          ADC PTR+1
  88.          STA OTABLE+7         
  89. ;
  90. ;MOVE THE CODE
  91. ;
  92.          LDA #>OODRIVER
  93.          STA OLDSTRT
  94.          LDA #<OODRIVER
  95.          STA OLDSTRT+1
  96.          LDA #>EOF
  97.          STA OLDEND
  98.          LDA #<EOF
  99.          STA OLDEND+1
  100.          LDA PTR
  101.          STA NEWSTRT
  102.          LDA PTR+1
  103.          STA NEWSTRT+1
  104.          LDY #$00
  105.          JSR MOVE
  106. ;
  107. ;
  108. ;SET UP USR VECTOR AND EXIT
  109. ;
  110. JUMPINST EQU $4C
  111. USRVECT  EQU $0A
  112. ;
  113.          LDA #JUMPINST  ;JUMP INSTRUCTION
  114.          STA USRVECT
  115.          LDA PTR
  116.          STA USRVECT+1
  117.          LDA PTR+1
  118.          STA USRVECT+2
  119.          RTS
  120. ;
  121. PAGES    DFB $05  ;RECALCULATED BY PROGRAM
  122. ALLOCERR JSR $FDDA
  123.          BRK
  124. ;
  125.          BRK
  126.          BRK
  127. ;
  128. ;*** OODRIVER ***
  129. ;
  130. ; STACK POINTS TO LAST BYTE OF THE JSR THAT GOT HERE.
  131. ; FIRST GET THE ENTRY NAME, THEN READ THROUGH OTABLE UNTIL ENTRY FOUND
  132. ; THEN GET CODE ADDRESS.  ADD 3 TO GET VARIABLE PTR.  STORE VAR PTR IN ZP.
  133. ; THEN JUMP TO THE CODE ADDRESS.
  134. ;
  135. ;
  136. OODRIVER TSX                 ;READ STACK TO FIND OBJ TO BE CALLED
  137.          INX
  138.          LDA STACK,X
  139.          CLC
  140.          ADC #$01            ;ADD 1 TO GET TO THE DATA
  141.          STA PTR
  142.          LDA STACK+1,X
  143.          ADC #$00
  144.          STA PTR+1             ;WE NOW HAVE PTR TO OBJECT NAME TO CALL
  145. ;
  146. ; NOW GET A POINTER TO THE OBJECT TABLE
  147. ;
  148. MYADRS   EQU $0B   ;USER INVOKED US VIA USR() VECTOR. THIS IS ADRS OF OODRIVER
  149. TABLPTR  EQU $08   ;WE'LL CREATE THIS POINTER
  150. ;
  151.          SEC
  152.          LDA #>OTABLE        ;GET UNRELOCATED LO BYTE
  153.          SBC #>OODRIVER        ;SUBTRACT OODRIVER TO GET OFFSET
  154.          STA TABLPTR
  155. ;
  156.          LDA #<OTABLE        ;DO SAME FOR UNRELOCATED HI BYTE
  157.          SBC #<OODRIVER
  158.          STA TABLPTR+1
  159. ;                            ;NOW ADD OFFSET TO BASE ADDRESS
  160.          CLC
  161.          LDA TABLPTR
  162.          ADC MYADRS          
  163.          STA TABLPTR
  164.          LDA TABLPTR+1
  165.          ADC MYADRS+1
  166.          STA TABLPTR+1
  167. ;
  168. ;
  169.          LDX #$00
  170. SEARCH0  LDY #$00
  171. SEARCH1  LDA (TABLPTR),Y
  172.          CMP (PTR),Y         ;SEE IF ALL 6 CHARACTERS MATCH
  173.          BNE NOMATCH
  174.          INY
  175.          CPY #$06
  176.          BNE SEARCH1
  177.          BEQ FOUNDIT
  178. ;
  179. NOMATCH  CLC                 ;ADD 8 TO GET NEXT ENTRY
  180.          LDA TABLPTR
  181.          ADC #$08
  182.          STA TABLPTR
  183.          LDA TABLPTR+1
  184.          ADC #$00
  185.          STA TABLPTR+1
  186. ;
  187.          INX                 ;CHECK NEXT ENTRY
  188.          BNE SEARCH0
  189. ;
  190.          LDA #$00
  191.          JSR $FDDA           ;ABEND CODE $00 (OBJ NOT FOUND)
  192.          BRK                 ;ABEND IF NOT FOUND 
  193. ;
  194. ;
  195. FOUNDIT  LDA (TABLPTR),Y     ;Y WAS 7 WHEN WE FOUND IT.
  196.          STA PTR             ;SET UP CODE ADDRESS FOR JMP
  197.          INY
  198.          LDA (TABLPTR),Y
  199.          STA PTR+1
  200. ;
  201. ; *** FINAL RETURN ***
  202. ; ADJUST STACK RETURN ADRS BY 6 BYTES
  203. ; TO ACCOUNT FOR OBJECT NAME WE JUST READ
  204. ; THEN INVOKE OBJECT.
  205. ;
  206.          TSX        
  207.          INX
  208.          LDA STACK,X
  209.          CLC
  210.          ADC #$06            ;ADD 6 TO SKIP TO LAST BYTE OF NAME
  211.          STA STACK,X
  212.          LDA STACK+1,X
  213.          ADC #$00
  214.          STA STACK+1,X
  215. ;
  216.          JMP (PTR)           ;INVOKE THE OBJECT CODE
  217. ;
  218. ;
  219. ;
  220. ;
  221. ;*** OSETUP ***
  222. ;osetup POPS adrs from stack and stores adrs of codejump in table.
  223. ;adds 1 to get to name of object to store
  224. ;looks for free node (indicated by 00 in first byte).
  225. ;It then terminates so it doesn't return to object.
  226. ;
  227. OSETUP   CLC
  228.          PLA
  229.          ADC #$01
  230.          STA PTR
  231.          PLA
  232.          ADC #$00
  233.          STA PTR+1
  234. ;
  235. ; get addressability to object table
  236. ;
  237.          SEC
  238.          LDA #>OTABLE        ;GET UNRELOCATED LO BYTE
  239.          SBC #>OODRIVER        ;SUBTRACT OODRIVER TO GET OFFSET
  240.          STA TABLPTR
  241. ;
  242.          LDA #<OTABLE        ;DO SAME FOR UNRELOCATED HI BYTE
  243.          SBC #<OODRIVER
  244.          STA TABLPTR+1
  245. ;                            ;NOW ADD OFFSET TO BASE ADDRESS
  246.          CLC
  247.          LDA TABLPTR
  248.          ADC MYADRS          
  249.          STA TABLPTR
  250.          LDA TABLPTR+1
  251.          ADC MYADRS+1
  252.          STA TABLPTR+1
  253. ;
  254. ; look for a free node to store the new object
  255. ;
  256.          LDX #$00
  257. SRCHFRE0 LDY #$00
  258.          LDA (TABLPTR),Y
  259.          BNE NOTFREE
  260.          BEQ FOUNDFR
  261. ;
  262. NOTFREE  CLC                 ;ADD 8 TO GET NEXT ENTRY
  263.          LDA TABLPTR
  264.          ADC #$08
  265.          STA TABLPTR
  266.          LDA TABLPTR+1
  267.          ADC #$00
  268.          STA TABLPTR+1
  269. ;
  270.          INX                 ;CHECK NEXT ENTRY
  271.          BNE SRCHFRE0
  272. ;
  273.          LDA #$FF            ;ABEND CODE $FF (TABLE FULL)
  274.          JSR $FDDA
  275.          BRK                 ;ABEND IF NOT FOUND 
  276. ;
  277. FOUNDFR  LDY #$00            ;CREATE THE TABLE ENTRY
  278. ENTERIT  LDA (PTR),Y
  279.          STA (TABLPTR),Y
  280.          INY
  281.          CPY #$06
  282.          BNE ENTERIT
  283. ;                            ;STORE THE CODE ADDRESS IN THE TABLE.
  284.          CLC
  285.          LDA PTR           
  286.          ADC #$06
  287.          STA PTR
  288.          STA (TABLPTR),Y
  289.          INY
  290.          LDA PTR+1
  291.          ADC #$00
  292.          STA PTR+1
  293.          STA (TABLPTR),Y
  294.          RTS
  295. ;
  296. ;
  297. ; *** OBJECT TABLE ***
  298. ;
  299. ;EACH OBJECT HAS 6 BYTE NAME AND 2 BYTE ADDRESS
  300. ;
  301. OTABLE   ASC 'OSETUP'                  ;OBJECT 0 IS OSETUP
  302.          DFB >OSETUP,<OSETUP
  303. ;
  304.          DS  $07F8                ;ROOM FOR 255 MORE OBJECTS
  305. ;
  306. EOF      DFB $FF         ;MARKER FOR SIGHTING EOF
  307.