home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-08-26 | 7.0 KB | 308 lines | [04] ASCII Text (0x0000) |
- ; *** OBJECT ORIENTED DRIVER ***
- ;
- ;
- ORG $2000
- ;
- OLDSTRT EQU $3C ;START ADRS FOR MOVE
- OLDEND EQU $3E ;END ADRS FOR MOVE
- NEWSTRT EQU $42 ;DESTINATION FOR MOVE
- ;
- MOVE EQU $FE2C ;MONITOR MOVE ROUTINE
- MLIALLOC EQU $BEF5 ;MLI MEMORY ALLOCATOR
- ;
- STACK EQU $100
- PTR EQU $06 ;FOR STEPPING THRU INLINE CODE
- ;
- ;
- ; *** RELOCATE THE OODRIVER TO HIGH MEMORY ***
- ;
- ; FILL OBJECT TABLE WITH ZEROES, THEN SET UP ENTRY FOR 'OSETUP' (OBJ #0)
- ; ADJUST OSETUP ENTRY IN THE OBJECT TABLE (WILL ALWAYS BE +7,+8)
- ; THEN ALLOCATE MEMORY AND MOVE THE WHOLE THING UP THERE
- ;
- CLC
- LDA #>OTABLE ;GET PTR INTO OTABLE+8
- ADC #$08
- STA PTR
- LDA #<OTABLE
- ADC #$00
- STA PTR+1
- ;
- LDX #$FF
- WHAP0 LDY #$00
- LDA #$00
- WHAP1 STA (PTR),Y
- INY
- CPY #$08
- BNE WHAP1
- CLC
- LDA PTR ;GET NEXT ADDRESS FOR ZEROING
- ADC #$08
- STA PTR
- LDA PTR+1
- ADC #$00
- STA PTR+1
- DEX
- BNE WHAP0
- ;
- ; CALCULATE NUMBER OF PAGES NEEDED
- ;
- SEC
- LDA #<EOF
- SBC #<OODRIVER
- CLC
- ADC #$01 ;ONE EXTRA PAGE FOR MESSAGE PASSING
- STA PAGES
- ;
- LDA PAGES ;ALLOCATE THE BLOCK
- JSR MLIALLOC
- BCS ALLOCERR
- STA PTR+1 ;SAVE POINTER TO ALLOCATED MEMORY
- INC PTR+1 ;ADD 1 TO ALLOW FOR MESSAGE PAGE
- LDA #$00
- STA PTR
- ;
- ; ZERO OUT THE MESSAGE PAGE
- DEC PTR+1
- LDY #$00
- LDA #$00
- ZEROIT STA (PTR),Y
- INY
- BNE ZEROIT
- INC PTR+1
- ;
- ; ADJUST ADDRESS OF OSETUP IN OBJECT TABLE
- ;
- SEC
- LDA #>OSETUP
- SBC #>OODRIVER
- STA OTABLE+6
- LDA #<OSETUP
- SBC #<OODRIVER
- STA OTABLE+7
- CLC
- LDA OTABLE+6
- ADC PTR
- STA OTABLE+6
- LDA OTABLE+7
- ADC PTR+1
- STA OTABLE+7
- ;
- ;MOVE THE CODE
- ;
- LDA #>OODRIVER
- STA OLDSTRT
- LDA #<OODRIVER
- STA OLDSTRT+1
- LDA #>EOF
- STA OLDEND
- LDA #<EOF
- STA OLDEND+1
- LDA PTR
- STA NEWSTRT
- LDA PTR+1
- STA NEWSTRT+1
- LDY #$00
- JSR MOVE
- ;
- ;
- ;SET UP USR VECTOR AND EXIT
- ;
- JUMPINST EQU $4C
- USRVECT EQU $0A
- ;
- LDA #JUMPINST ;JUMP INSTRUCTION
- STA USRVECT
- LDA PTR
- STA USRVECT+1
- LDA PTR+1
- STA USRVECT+2
- RTS
- ;
- PAGES DFB $05 ;RECALCULATED BY PROGRAM
- ALLOCERR JSR $FDDA
- BRK
- ;
- BRK
- BRK
- ;
- ;*** OODRIVER ***
- ;
- ; STACK POINTS TO LAST BYTE OF THE JSR THAT GOT HERE.
- ; FIRST GET THE ENTRY NAME, THEN READ THROUGH OTABLE UNTIL ENTRY FOUND
- ; THEN GET CODE ADDRESS. ADD 3 TO GET VARIABLE PTR. STORE VAR PTR IN ZP.
- ; THEN JUMP TO THE CODE ADDRESS.
- ;
- ;
- OODRIVER TSX ;READ STACK TO FIND OBJ TO BE CALLED
- INX
- LDA STACK,X
- CLC
- ADC #$01 ;ADD 1 TO GET TO THE DATA
- STA PTR
- LDA STACK+1,X
- ADC #$00
- STA PTR+1 ;WE NOW HAVE PTR TO OBJECT NAME TO CALL
- ;
- ; NOW GET A POINTER TO THE OBJECT TABLE
- ;
- MYADRS EQU $0B ;USER INVOKED US VIA USR() VECTOR. THIS IS ADRS OF OODRIVER
- TABLPTR EQU $08 ;WE'LL CREATE THIS POINTER
- ;
- SEC
- LDA #>OTABLE ;GET UNRELOCATED LO BYTE
- SBC #>OODRIVER ;SUBTRACT OODRIVER TO GET OFFSET
- STA TABLPTR
- ;
- LDA #<OTABLE ;DO SAME FOR UNRELOCATED HI BYTE
- SBC #<OODRIVER
- STA TABLPTR+1
- ; ;NOW ADD OFFSET TO BASE ADDRESS
- CLC
- LDA TABLPTR
- ADC MYADRS
- STA TABLPTR
- LDA TABLPTR+1
- ADC MYADRS+1
- STA TABLPTR+1
- ;
- ;
- LDX #$00
- SEARCH0 LDY #$00
- SEARCH1 LDA (TABLPTR),Y
- CMP (PTR),Y ;SEE IF ALL 6 CHARACTERS MATCH
- BNE NOMATCH
- INY
- CPY #$06
- BNE SEARCH1
- BEQ FOUNDIT
- ;
- NOMATCH CLC ;ADD 8 TO GET NEXT ENTRY
- LDA TABLPTR
- ADC #$08
- STA TABLPTR
- LDA TABLPTR+1
- ADC #$00
- STA TABLPTR+1
- ;
- INX ;CHECK NEXT ENTRY
- BNE SEARCH0
- ;
- LDA #$00
- JSR $FDDA ;ABEND CODE $00 (OBJ NOT FOUND)
- BRK ;ABEND IF NOT FOUND
- ;
- ;
- FOUNDIT LDA (TABLPTR),Y ;Y WAS 7 WHEN WE FOUND IT.
- STA PTR ;SET UP CODE ADDRESS FOR JMP
- INY
- LDA (TABLPTR),Y
- STA PTR+1
- ;
- ; *** FINAL RETURN ***
- ; ADJUST STACK RETURN ADRS BY 6 BYTES
- ; TO ACCOUNT FOR OBJECT NAME WE JUST READ
- ; THEN INVOKE OBJECT.
- ;
- TSX
- INX
- LDA STACK,X
- CLC
- ADC #$06 ;ADD 6 TO SKIP TO LAST BYTE OF NAME
- STA STACK,X
- LDA STACK+1,X
- ADC #$00
- STA STACK+1,X
- ;
- JMP (PTR) ;INVOKE THE OBJECT CODE
- ;
- ;
- ;
- ;
- ;*** OSETUP ***
- ;osetup POPS adrs from stack and stores adrs of codejump in table.
- ;adds 1 to get to name of object to store
- ;looks for free node (indicated by 00 in first byte).
- ;It then terminates so it doesn't return to object.
- ;
- OSETUP CLC
- PLA
- ADC #$01
- STA PTR
- PLA
- ADC #$00
- STA PTR+1
- ;
- ; get addressability to object table
- ;
- SEC
- LDA #>OTABLE ;GET UNRELOCATED LO BYTE
- SBC #>OODRIVER ;SUBTRACT OODRIVER TO GET OFFSET
- STA TABLPTR
- ;
- LDA #<OTABLE ;DO SAME FOR UNRELOCATED HI BYTE
- SBC #<OODRIVER
- STA TABLPTR+1
- ; ;NOW ADD OFFSET TO BASE ADDRESS
- CLC
- LDA TABLPTR
- ADC MYADRS
- STA TABLPTR
- LDA TABLPTR+1
- ADC MYADRS+1
- STA TABLPTR+1
- ;
- ; look for a free node to store the new object
- ;
- LDX #$00
- SRCHFRE0 LDY #$00
- LDA (TABLPTR),Y
- BNE NOTFREE
- BEQ FOUNDFR
- ;
- NOTFREE CLC ;ADD 8 TO GET NEXT ENTRY
- LDA TABLPTR
- ADC #$08
- STA TABLPTR
- LDA TABLPTR+1
- ADC #$00
- STA TABLPTR+1
- ;
- INX ;CHECK NEXT ENTRY
- BNE SRCHFRE0
- ;
- LDA #$FF ;ABEND CODE $FF (TABLE FULL)
- JSR $FDDA
- BRK ;ABEND IF NOT FOUND
- ;
- FOUNDFR LDY #$00 ;CREATE THE TABLE ENTRY
- ENTERIT LDA (PTR),Y
- STA (TABLPTR),Y
- INY
- CPY #$06
- BNE ENTERIT
- ; ;STORE THE CODE ADDRESS IN THE TABLE.
- CLC
- LDA PTR
- ADC #$06
- STA PTR
- STA (TABLPTR),Y
- INY
- LDA PTR+1
- ADC #$00
- STA PTR+1
- STA (TABLPTR),Y
- RTS
- ;
- ;
- ; *** OBJECT TABLE ***
- ;
- ;EACH OBJECT HAS 6 BYTE NAME AND 2 BYTE ADDRESS
- ;
- OTABLE ASC 'OSETUP' ;OBJECT 0 IS OSETUP
- DFB >OSETUP,<OSETUP
- ;
- DS $07F8 ;ROOM FOR 255 MORE OBJECTS
- ;
- EOF DFB $FF ;MARKER FOR SIGHTING EOF
-