 .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

