.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