home *** CD-ROM | disk | FTP | other *** search
- .PAGE "VIC Object code boot from USER port"
- ; BOOT : VIC PROGRAM TO RECEIVE AIM FORMAT OBJECT
- ; CODE FLIES THROUGH THE VIC USER PORT.
-
- ; VIC 6522 VIA PORT ADDRESSES
-
- ORB1 =$9110 ;I/O REGISTER B
- DDRB1 =$9112 ;DATA DIRECTION REGISTER B
- PCR1 =$911C ;PERIPHERAL CONTROL REGISTER 1
- IFR1 =$911D ;INTERRUPT FLAG REGISTER
- IER1 =$911E ;INTERRUPT ENABLE REGISTER
-
- ; VIC subroutines
-
- STOP =$FFE1 ;check for stop key down
-
- ; ZERO PAGE STORAGE
-
- VICKEY =$C5 ;current key down
- KISTAK =$C6 ;keyboard input stack
- staksav =$fb ;stack save for RCHEK sub
- BYTMP =$FD ;INPUT BYTE TEMPORARY
- PTRLO =$FE ;LOAD POINTER
- PTRHI =$FF
-
- CTLZ =$1a ;end of file charcter
-
- *=$33C ;locate in the tape buffer
-
- BOOT CLD
- tsx ;save stack for STOP exit
- stx staksav
- JSR INITIO ;INIT USER PORT
- RECLUP JSR GETCHR ;SCAN FOR A ';'
- cmp #CTLZ ;end of file char?
- beq bootex ;yes end
- CMP #$3b
- BNE RECLUP
- JSR GETBYT ;GET RECORD LENGTH
- TAX ;ZERO?
- BEQ EOT ;YES, WE'RE DUN
- JSR GETBYT ;GET HI ORDER LOAD ADDRESS
- STA PTRHI ;SAVE
- JSR GETBYT ;GET LO ORDER
- STA PTRLO ;SAVE
- LDY #$0 ;CLEAR INDEX
- BYTLUP JSR GETBYT ;GET AN OBJECT BYTE
- STA (PTRLO),Y ;SAVE IT
- INY ;BUMP INDEX
- DEX ;COUNT BYTE
- BNE BYTLUP ;LOOP 'TILL ZERO
- BEQ RECLUP ;THEN GET NEXT RECORD
-
- EOT ;look for control z to end
- ENDLUP JSR GETCHR ;TO END THE RECORD
- cmp #CTLZ
- BNE ENDLUP
- bootex clc
- RTS
-
- ; GETBYT : INPUT TWO ASCII HEX DIGITS AND
- ; PACK INTO ONE BYTE.
-
- GETBYT JSR GETCHR ;INPUT BYTE
- JSR PACK ;PACK INTO 1 NYBBLE
- JSR GETCHR ;GET 2ND HALF
- JSR PACK ;PACK IT
- LDA BYTMP ;RETRIEVE RESULT
- RTS
-
- ; PACK : PACK ASCII DIGIT INTO NYBBLE
-
- PACK CMP #$3A ;NUMERIC?
- AND #$F ;CLEAR HI NYBBLE
- BCC NOADD ;YES, SKIP ADD
- ADC #8 ;ADD 8 + CARRY
- NOADD ASL BYTMP ;SHIFT BYTMP
- ASL BYTMP
- ASL BYTMP
- ASL BYTMP
- ORA BYTMP ;INSERT DIGIT
- STA BYTMP ;SAVE
- RTS
-
- ; INITIO : PREPARE THE VIA FOR INPUT
-
- INITIO LDA PCR1 ;GET PCR
- AND #$0F;CLEAR B PORT BITS
- ORA #$A0 ;SET PULSE MODE
- STA PCR1 ;PUT IN PCR
- LDA #0 ;SET ALL BITS TO INPUT
- STA DDRB1
- LDA #$10 ;DISABLE INTERRUPT
- STA IER1
- LDA ORB1 ;GET FIRST CHARACTER
- RTS
-
- ; GETCHR : INPUT 1 BYTE FROM USER PORT
-
- GETCHR LDA #$10 ;MASK FOR CB1 INTERRUPT
- WAITC JSR RCHEK ;ALLOW INTERRUPTS
- BIT IFR1 ;IS IT ON?
- BEQ WAITC ;NO, WAIT FOR IT
- LDA ORB1 ;RETRIEVE BYTE
- STA ORB1 ;NOTIFY SENDER
- RTS
-
-
-
- ; RCHEK : CHECK FOR INTERRUPT
-
- RCHEK PHA ;SAVE ACCUM
- JSR STOP ;RUN/STOP KEY DOWN?
- BNE CKSPAC ;NO, SKIPPIT
- LDA #0 ;CLEAR KEYBOARD STACK
- STA KISTAK
- ldx staksav ;restore stack
- txs
- clc
- rts ;return to caller
-
- CKSPAC LDA VICKEY ;GET CURRENT KEY
- CMP #$20 ;SPACE BAR DOWN?
- BEQ CKSPAC ;YES, PAUSE TILL IT LIFTS
- LDA #0
- STA KISTAK ;CLEAR KEYBOARD STACK
- RCOUT PLA
- RTS
-
-