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