


       NAM P2708
       OPT O,NOG
*
************************************************
*
*      STARTING ADDRESS OF THE PROGRAM IS $400.
*
*
*      PROGRAM / USER CONVERSATION
*
*         PROM LOADER
*         
*         FILE NAME = XYZ
*         PROM ADDRESS = NN00
*
*         .
*
*         PROM PROGRAMMER
*
*         %     (PP LO PROMPT)
*
*
*      XYZ IS THE NAME OF THE OBJECT FILE FOLLOWED BY
*      A CARRIAGE RETURN
*      NN00 IS THE STARTING ADDRESS OF THE PROM FOLLOWED BY
*      BY A CARRIAGE RETURN
*
*      THE ADDRESSES IN THE OBJECT FILE ARE CONVERTED TO
*      (ADDRESS - NN00 + 1000). 
*      DATABYTES WITH CONVERTED ADDRESSES FROM 1000 THRU
*      1FFF ARE LOADED.
*
*      IF THE OBJECT FILE IS LOADED CORRECTLY, THE 
*      MOTOROLA PROMPROGRAMMER PP LO IS STARTED.
*
*      CODE FOR 1ST 2708:  1000 - 13FF
*      CODE FOR 2ND 2708:  1400 - 17FF
*      CODE FOR 3RD 2708:  1800 - 1BFF
*      CODE FOR 4TH 2708:  1C00 - 1FFF
*
*
*
*      THE OBJECT FILE OBJ OF THE FOLLOWING PROGRAM 
*      HAS TO BE MERGED WITH PP LO AS FOLLOWS:
*
*                    MERGE,P2708,PP LO,OBJ
*
*      THEN PP LO HAS TO NEW COMMANDS:
*
*             %L      START PROM LOADER TO LOAD
*                     NEXT OBJECT FILE
*             %D      START EDOS-II
*
*********************************************
       PAGE
       ORG $400
*
START  LDS #$FFF
       JSR RESET  INITIALIZE FLOPPY DISK
       JSR TEXT
       FCC /__PROM LOADER__@/
FN     LDS #$FFF
       JSR TEXT
       FCC /_FILE NAME = @/
       LDAA #'   SPACE
       STAA A1  A1 - A5 ARE FILLED WITH
       STAA A2  SPACE CODE 
       STAA A3
       STAA A4
       STAA A5
       CLR UNIT  UNIT IS PRESET TO 0
       LDX #A1  X POINTER TO A1
*
*INPUT FILE NAME 
*
INPUT  JSR INCH  INPUT CHARACTER
       CMPA #$7F  CHARACTER IS RUBOUT ?
       BNE L1  NO
RUBO   LDAA #'<  YES,
       JSR OUTCH  OUTPUT <
       BRA FN  RETURN TO FN
L1     CMPA #':  CHARACTER IS : ?
       BEQ RU  YES, READ UNIT NUMBER
       CMPA #$D  NO;  CHARACTER IS CR ?
       BEQ IFR  YES, INPUT FILE NAME READY
       CPX #UNIT  NO, X POINTER TO UNIT ?
       BEQ INPUT YES, MORE THEN 5 CHARACTERS
       STAA 0,X  NO, STORE CHARACTER
       INX  INCREMENT POINTER
       BRA INPUT  INPUT NEXT CHARACTER
*
*
RU     CLRB  READ UNIT NUMBER
RU1    JSR INCH  INPUT CHARACTER
       CMPA #$7F  CHARACTER IS RUBOUT ?
       BEQ RUBO  YES
       CMPA #$D  NO, CHARACTER IS CR ?
       BEQ IFR  YES, INPUT FILE NAME READY
       TSTB  NO;  B=0 ?
       BNE RU1  NO, WAIT FOR CR
       CMPA #'3  TEST FOR 0,1,2, AND 3
       BGT QM  ILLEGAL CHARACTER
       SUBA #'0
       BMI QM  ILLEGAL CHARACTER
       RORA  SHIFT BITS 0 AND 1
       RORA  INTO POSITIONS 6 AND 7
       RORA
       ANDA #$C0  CLEAR BITS 0 THRU 5
       STAA UNIT  UNIT NUMBER IN BITS 6,7
       INCB  B=1, UNIT NUMBER STORED
       BRA RU1  WAIT FOR CR
*
QM     JSR TEXT  OUTPUT QUESTION MARKS
       FCC /???_@/
       BRA FN  RETURN TO FN
*
*INPUT FILENAME READY
*
IFR    JSR CRLF  CARRIAGE RETURN, LINE FEED
       LDX #$30  INITIALIZE FOR DIRECTORY
       STX  ISIZE
       CLR ITRK  TRACK 0
       CLR ICNTR  COUNTER = 0
       LDAA #3  SECTOR 4 (-1) AND
       ADDA UNIT  UNIT NUMBER
       STAA ISCTR
*
RSECT  LDAA #128  READ SECTOR
       STAA CNT  CNT=128
       LDX #BB  BEGIN BUFFER
       STX SX  SX BUFFER POINTER
RBYTE  JSR RI  READ BYTE FROM DISK
       LDX SX
       STAA 0,X  STORE BYTE IN BUFFER
       INX  INCREMENT BUFFER POINTER
       STX SX
       DEC CNT  128 BYTES ?
       BNE RBYTE  NO, READ NEXT BYTE
       LDAB #11  YES,  B=11
       LDX #BB  X BUFFER POINTER
*
*SEARCHFILE NAME IN DIRECTORY
*
TEST   LDAA 5,X  READ ATTRIBUTE
       CMPA #$80  DELETED FILE ?
       BNE TEST1  NO
NEXT   DECB  LAST FCB IN SECTOR ?
       BEQ RSECT  YES, READ NEXT SECTOR
       STX SX  NO, INCREMENT X BY 11
       LDAA SX+1
       ADDA #11
       STAA SX+1
       LDAA #0
       ADCA SX
       STAA SX
       LDX SX
       BRA TEST  NEXT FCB
*
TEST1  CMPA #$FF  END OF DIRECTORY ?
       BEQ QM  YES, FILE NOT FOUND
*
*COMPAREFILENAME WITH NAME IN DIRECTORY
*
       LDAA 0,X
       CMPA A1  FIRST CHARACTER = A1 ?
       BNE NEXT  NO, NEXT FCB
       LDAA 1,X
       CMPA A2  SECOND CHARACTER = A2 ?
       BNE NEXT  NO, NEXT FCB
       LDAA 2,X
       CMPA A3  THIRD CHARACTER = A3 ?
       BNE NEXT  NO, NEXT FCB
       LDAA 3,X
       CMPA A4  FOURTH CHARACTER = A4 ?
       BNE NEXT  NO, NEXT FCB
       LDAA 4,X
       CMPA A5  FIFTH CHARACTER = A5 ?
       BNE NEXT  NO, NEXT FCB
*
*INITIALIZEFOR READING FILE
*
       LDAA 6,X  TRACK NUMBER
       STAA ITRK
       LDAA UNIT  UNIT NUMBER
       ADDA 7,X  + SECTOR NUMBER
       DECA  - 1
       STAA ISCTR
       CLR ICNTR  CLEAR COUNTER
       LDX 8,X  SIZE
       STX ISIZE
*
*INPUT FIRST ADDRESS OF PROM
*
PA1    JSR TEXT
       FCC /PROM ADDRESS = @/
       CLRA
       CLRB
PA2    PSHA
       JSR INCH  INPUT CHARACTER
       CMPA #$D  CARRIAGE RETURN ?
       BEQ LOAD  YES
       CMPA #'0  NO, TEST FOR HEX DIGIT
       BLT PA4  IL@FGL CHARACTER
       CMPA #'9
       BLE PA3
       CMPA #'A
       BLT PA4  ILLEGAL CHARACTER
       CMPA #'F
       BGT PA4  ILLEGAL CHARACTER
       ADDA #9
PA3    ANDA #$F  CLEAR BITS 4 THRU 7
       STAA PROMA  TEMPORARY STORAGE
       PULA  MULTIPLY OLD ADDRESS
       ASLA  BY 16
       ROLB
       ASLA
       ROLB
       ASLA
       ROLB
       ASLA
       ROLB
       ADDA PROMA  ADD NEW DIGIT
       BRA PA2  INPUT NEXT DIGIT
PA4    LDAA #'?  ILLEGAL CHARACTER
       JSR OUTCH  OUTPUT ? AND
       JSR CRLF  CARRIAGE RETURN, LINE FEED
       INS  ADJUST STACK POINTER
       BRA PA1
*
*LOAD  HEX FILE
*
*ADRESSESOF THE FILE ARE CONVERTED IN
*(ADDRESS-PROMA+1000)
*MAX.  4K DATA BYTES ARE STORED IN
*LOCATIONS1000-1FFF
*
LOAD   INS  ADJUST STACKPOINTER
       STAB PROMA  FIRST ADDRESS OF PROM
       CLR PROMA+1  LS BYTE = 0
       JSR CRLF  CARRIAGE RETURN, LINE FEED
       LDX #$1000  X POINTER TO BUFFER RAM
       LDAA #$01  FILLER (NOP)
FILL   STAA 0,X  FILL BUFFER WITH FILLER
       INX
       CPX #$2000  BUFFER FILLED ?
       BNE FILL  NO
       STAA CKSUM  CHECKSUM NOT 0
LOAD1  JSR IN  INPUT BYTE FROM DISK
       CMPA #'S  ASCII S ?
       BNE LOAD1  NO, GET NEXT BYTE
       JSR IN  YES, INPUT BYTE FROM DISK
       CMPA #'9  ASCII 9 ?
       BNE LOAD2  NO
       LDAA #'.  YES, S9 MARK
       JSR OUTCH  OUTPUT .
       BRA LOAD1  READ NEXT BYTE
LOAD2  CMPA #'1  ASCII 1 ?
       BNE LOAD1  NO, READ NEXT BYTE
       CLR CKSUM  YES, S1 MARK, CLEAR CKSUM
       JSR BYTE  READ BYTECOUNT
       SUBA #2  SUBTRACT 2
       STAA BYTECT  STORE # OF BYTES -2
       JSR BYTE  READ MS ADDRESS BYTE
       STAA ADR
       JSR BYTE  READ LS ADDRESS BYTE
       STAA ADR+1
LOAD3  JSR BYTE  READ BYTE
       DEC BYTECT  LAST BYTE ?
       BEQ LOAD4  YES
       LDX ADR  NO, COMPUTE ADDRESS
       STX SX  SAVE X
       INX  INCREMENT ADR
       STX ADR
       LDAB SX  B = MS BYTE SX
       SUBB PROMA  - MS BYTE PROMADDRESS
       ADDB #$10  +10 (HEX)
       CMPB #$1F  B HIGHER THEN 1F (HEX) ?
       BHI LOAD3  YES, DON'T STORE DATA
       CMPB #$F  B HIGHER THEN F (HEX) ?
       BLS LOAD3  DON'T STORE DATA
       STAB SX  STORE MS BYTE ADDRESS
       LDX SX
       STAA 0,X  STORE DATA
       CMPA 0,X  DATA STORED CORRECTLY ?
       BEQ LOAD3  YES, GET NEXT BYTE
       JSR TEXT  NO
       FCC /_CAN'T LOAD RAM@/
       JMP FN  RETURN TO FN
LOAD4  INC CKSUM  CHECKSUM OK ?
       BEQ LOAD1  YES, NEXT LINE
LOAD5  JSR TEXT  NO
       FCC /_CHECKSUM ERROR@/
       JMP FN  RETURN TO FN
*
*READ  BYTE FROM DISK AND TEST
*FOR   END OF FILE
*
IN     JSR RI  READ BYTE, END OF FILE ?
       BCS IN1  YES
       RTS  NO, RETURN FROM SUBROUTINE
IN1    INS  ADJUST STACK POINTER
       INS
       TST CKSUM  CHECKSUM=0 ?
       BNE LOAD5  NO, CHECKSUM ERROR
       JSR TEXT  YES
       FCC /__PROM PROGRAMMER_@/
       JMP $20  START PP LO
*
*
BYTE   BSR INHEX  INPUT HEX DIGIT
       ASLA    (MS BITS)
       ASLA
       ASLA
       ASLA
       PSHA
       BSR INHEX  INPUT HEX DIGIT
       PULB  (LS BITS)
       ABA  FORM BYTE
       TAB
       ADDB CKSUM  ADD BYTD TO CHECKSUM
       STAB CKSUM
       RTS  RETURN FROM SUBROUTINE
*
*
INHEX  BSR IN  INPUT BYTE FROM DISK
       CMPA #'0  TEST FOR HEX DIGIT
       BLT FE  ILLEGAL CHARACTER
       CMPA #'9
       BLE INHEX1
       CMPA #'A
       BLT FE  ILLEGAL CHARACTER
       CMPA #'F
       BGT FE  ILLEGAL CHARACTER
       ADDA #9
INHEX1 ANDA #$F  CLEAR BITS 4 THRU 7
       RTS  RETURN FROM SUBROUTINE
FE     JSR TEXT  ILLEGAL CHARACTER
       FCC /_FORMAT ERROR_@/
       JMP FN  RETURN TO FN
*
*
A1     RMB 1  1ST CHARACTER FILE NAME
A2     RMB 1  2ND CHARACTER FILE NAME
A3     RMB 1  3RD CHARACTER FILE NAME
A4     RMB 1  4TH CHARACTER FILE NAME
A5     RMB 1  5TH CHARACTER FILE NAME
UNIT   RMB 1  UNIT NUMBER
SX     RMB 2  TEMPORARY STORAGE X
CNT    RMB 1  COUNTER
ADR    RMB 2  ADDRESS
CKSUM  RMB 1  CHECKSUM
BYTECT RMB 1  BYTECOUNT
PROMA  RMB 2  PROMADDRESS
BB     RMB 128  128 BUFFER LOCATIONS
*
*
RESET  EQU $E806
OUTCH  EQU $F9DC
INCH   EQU $FAA0
ISIZE  EQU $4
ITRK   EQU $6
ISCTR  EQU $7
ICNTR  EQU $8
RI     EQU $E809
*
*
*TEXT  ROUTINE,
*        _ = CARRIAGE RETURN, LINE FEED
*        @ = END OF TEXT
*
*MAX.  254 CHARACTERS
*
*A,    B, AND X ARE SAVED
*
TEXT   STX TXTSX  SAVE X
       TSX  X POINTER TO RETURNADDRESS
       STX TXTRP  SAVE X FOR RETURN
       PSHA  SAVE A AND B
       PSHB
       LDX 0,X  X = DATAPOINTER
       CLRB  B = COUNTER
TEXT1  LDAA 0,X  GET CHARACTER
       INCB  INCREMENT COUNTER
       INX  INCREMENT DATAPOINTER
       CMPA #'@  END OF TEXT ?
       BEQ TEXT3  YES
       CMPA #'_  NO,  CRLF ?
       BNE TEXT2  NO
       BSR CRLF  YES
       BRA TEXT1  GET NEXT CHARACTER
*
*
CRLF   LDAA #$A  OUTPUT CARRIAGE RETURN,
       JSR $F9DC    LINE FEED
       LDAA #$D
       JSR $F9DC
       CLRA
       JMP $F9DC
*
*
TEXT2  JSR $F9DC  OUTPUT CHARACTER
       BRA TEXT1  GET NEXT CHARACTER
TEXT3  CLRA  COMPUTE RETURN ADDRESS
       LDX TXTRP
       ADDB 1,X
       ADCA 0,X
       STAA 0,X
       STAB 1,X
       PULB  RESTORE B, A, AND X
       PULA
       LDX TXTSX
       RTS  RETURN FROM SUBROUTINE
TXTSX  RMB 2
TXTRP  RMB 2
*
*
*EXTENSIONOF PP LO
*TEST  FOR L AND D COMMANDS
*
CHLD   JSR $AE  SUBROUTINE IN PP LO
       CMPA #'L  A = ASCII L ?
       BNE CHLD1  NO
       JMP START  YES, START LOADER
CHLD1  CMPA #'D  A = ASCII D ?
       BNE CHLD3  NO
       JSR CRLF  YES, 2 CRLF'S
       JSR CRLF
       LDS #$FF8A  INITIALIZE STACK
       LDX #0
CHLD2  INX  DELAY LOOP
       BNE CHLD2
       JMP $E800  START EDOS
CHLD3  RTS  RETURN TO PP LO
*
*
*PATCH ON  PP LO
*      JSR $AE IS REPLACED BY JSR CHLD
*
       ORG $6B
       JSR CHLD
*
       END
