10 ;  SAVE #D1:PARALLEL.M65
40 ;  LOAD #D1:SELFTEST.M65
0130 ;  *= $C745 14 Mar 96
0141     .PAGE "Parallel Device Handler"
0144      LIST  
0146     .LOCAL 
0150 ?JKP .= *
0160     *=  $D100   Parallel device
0161 ?PDGETPUT
0165     *=  $D101   equates
0166 ?PDRESET
0170     *=  $D1FF
0171 ?PDSELECT
0190     *=  $D800
0200     *=  *+2     Rom checksum
0210     *=  *+1     revision number
0220 ?PDID1 *= *+1   Device id num ($80)
0230     *=  *+1     Device type
0240 ?PDIOV *= *+3   i/o vector
0250 ?PDINTV *= *+3  int vector
0260 ?PDID2 *= *+1   id number ($91)
0270     *=  *+1     name (ascii)
0280 ?PDDEVTB *= *+2 open vector-1
0290     *=  *+2     close vector-1
0300     *=  *+2     get byte-1
0310     *=  *+2     put byte-1
0320     *=  *+2     status-1
0330     *=  *+2     special-1
0340 ?INITPD *= *+3  Jmp init
0350     *=  ?JKP
0355 ;
0360 ; Relocate routine to new address
0370 ;
051013 PDRELOC LDX #5 Clear 6 bytes
051015 ?RLOOP LDA #0 from $2C9-$2CE
051017   STA RUNADR,X Labels   Runadr
051020   DEX         cleared  Hiused
051021   BPL ?RLOOP  are    Zhiuse
051023 ?51023 LDA #0
051025   STA LCOUNT  Temporary counter
051028   JSR ?GETBYT
051031   LDY #156    Error code
051033   BCS ?RELXIT
051035   STA HIBYTE  csum lsb
051038   JSR ?GETBYT
051041   LDY #156
051043   BCS ?RELXIT
051045   STA RECLEN  csum msb
051048   LDA HIBYTE
051051   CMP #$0B
051053   BEQ ?51093
051055   ROL A
051056   TAX 
051057   LDA ?ADDRS,X
051060   STA RUNADR
051063   LDA ?ADDRS+1,X
051066   STA RUNADR+1
051069 ?51069 LDA RECLEN
051072   CMP LCOUNT
051075   BEQ ?51023
051077   JSR ?GETBYT
051080   LDY #156
051082   BCS ?RELXIT
051084   JSR ?RUN
051087   INC LCOUNT
051090   BNE ?51069
051092 ?RELXIT RTS   Return c=0 if ok
051093 ?51093 JSR ?GETBYT Handle
051096   LDY #156    end record
051098   BCS ?EXIT
051100   STA RUNADR
051103   JSR ?GETBYT
051106   LDY #156
051108   BCS ?EXIT
051110   STA RUNADR+1
051113   LDA RECLEN
051116   CMP #1
051118   BEQ ?51142
051120   BCC ?51145
051122   CLC 
051123   LDA RUNADR
051126   ADC LOADAD
051129   TAY 
051130   LDA RUNADR+1
051133   ADC LOADAD+1
051136 ?51136 STY RUNADR
051139   STA RUNADR+1
051142 ?51142 LDY #1
051144 ?EXIT RTS 
051145 ?51145 LDY #0
051147   LDA #0
051149   BEQ ?51136  Always
051151 ?GETBYT JMP (GBYTEA) Get byte
051154 ?RUN JMP (RUNADR) Exec run
051157 ?51157 LDY LCOUNT Handle text
051160   CPY #1      record
051162   BEQ ?51174
051164   BCS ?51281
051166   STA RELADR
051169   STA NEWADR
051172   BCC ?51280  Go always
051174 ?51174 STA RELADR+1
051177   STA NEWADR+1
051180   LDX #0
051182   LDA HIBYTE
051185   BEQ ?51193
051187   CMP #$0A
051189   BEQ ?51212
051191   LDX #2
051193 ?51193 CLC 
051194   LDA RELADR
051197   ADC LOADAD,X
051200   STA NEWADR
051203   LDA RELADR+1
051206   ADC LOADAD+1,X
051209   STA NEWADR+1
051212 ?51212 CLC 
051213   LDA NEWADR
051216   ADC RECLEN
051219   PHA 
051220   LDA #0
051222   ADC NEWADR+1
051225   TAY 
051226   PLA 
051227   SEC 
051228   SBC #2
051230   BCS ?OVRDEY
051232   DEY 
051233 ?OVRDEY PHA 
051234   TYA 
051235   CMP HIUSED+1,X
051238   PLA 
051239   BCC ?51257
051241   BNE ?51248
051243   CMP HIUSED,X
051246   BCC ?51257
051248 ?51248 STA HIUSED,X
051251   PHA 
051252   TYA 
051253   STA HIUSED+1,X
051256   PLA 
051257 ?51257 LDX HIBYTE
051260   CPX #1
051262   BEQ ?51280
051264   CPY MEMTOP+1
051267   BCC ?51280
051269   BNE ?51276
051271   CMP MEMTOP
051274   BCC ?51280
051276 ?51276 PLA 
051277   PLA 
051278   LDY #157
051280 ?51280 RTS 
051281 ?51281 SEC    Relocate text
051282   PHA         into memory
051283   LDA LCOUNT
051286   SBC #2
051288   CLC 
051289   ADC NEWADR
051292   STA LTEMP
051294   LDA #0
051296   ADC NEWADR+1
051299   STA LTEMP+1
051301   PLA 
051302   LDY #0
051304   STA (LTEMP),Y
051306   JMP ?51280  Just to a rts
051309 ?51309 CLC    Handle word
051310   ADC NEWADR  reference record
051313   STA LTEMP   type
051315   LDA #0
051317   ADC NEWADR+1
051320   STA LTEMP+1
051322   LDY #0
051324   LDA (LTEMP),Y
051326   CLC 
051327   ADC LOADAD
051330   STA (LTEMP),Y
051332   INC LTEMP
051334   BNE ?51338
051336   INC LTEMP+1
051338 ?51338 LDA (LTEMP),Y
051340   ADC LOADAD+1
051343   STA (LTEMP),Y
051345   RTS 
051346 ?51346 LDX #0 Handle low-byte
051348   LDY HIBYTE  and one-byte
051351   CPY #4      record type
051353   BCC ?51357
051355   LDX #2
051357 ?51357 CLC 
051358   ADC NEWADR
051361   STA LTEMP
051363   LDA #0
051365   ADC NEWADR+1
051368   STA LTEMP+1
051370   LDY #0
051372   LDA (LTEMP),Y
051374   CLC 
051375   ADC LOADAD,X
051378   STA (LTEMP),Y
051380   RTS 
051381 ?51381 PHA 
051382   LDA LCOUNT
051385   ROR A
051386   PLA 
051387   BCS ?51410
051389   CLC 
051390   ADC NEWADR
051393   STA LTEMP
051395   LDA #0
051397   ADC NEWADR+1
051400   STA LTEMP+1
051402   LDY #0
051404   LDA (LTEMP),Y
051406   STA HIBYTE
051409 ?51409 RTS 
051410 ?51410 CLC 
051411   ADC LOADAD
051414   LDA #0
051416   ADC LOADAD+1
051419   ADC HIBYTE
051422   LDY #0
051424   STA (LTEMP),Y
051426   BEQ ?51409
051428 ?ADDRS .WORD ?51157
051430   .WORD ?51157
051432   .WORD ?51346
051434   .WORD ?51346
051436   .WORD ?51346
051438   .WORD ?51346
051440   .WORD ?51309
051442   .WORD ?51309
051444   .WORD ?51381
051446   .WORD ?51381
051448   .WORD ?51157
051450   .WORD ?51093
051452 JSLFTST LDA #$FF Select and
051454   STA COLDST  exec selftest
051457   LDA PORTB
051460   AND #$7F
051462   STA PORTB
051465   JMP SLFTSV  Following on Reset
051468 GPDINI LDA #1 Init generic
051470   STA SHPDVS  parallel device
051473 ?51473 LDA SHPDVS handler.
051476   STA ?PDSELECT Select device
051479   LDA ?PDID1  Check id bytes
051482   CMP #$80    skip if wrong
051484   BNE ?51496
051486   LDA ?PDID2
051489   CMP #$91
051491   BNE ?51496
051493   JSR ?INITPD Initialize it
051496 ?51496 ASL SHPDVS Next device
051499   BNE ?51473  Do all 8 possible
051501   LDA #0
051503   STA ?PDSELECT Deselect pd
051506   RTS 
051507 SIOUTL LDA #1 Siov points here
051509    ASTA  CRITIC and tries pd
051512   LDA DUNIT   before serial
051515   PHA 
051516   LDA PDVMSK  See if any PD
051519   BEQ ?NOTPD  No
051521   LDX #8
051523 ?TRYPD JSR ?SELECT Got device?
051526   BEQ ?NOTPD  No go to serial io
051528   TXA         Save device
051529   PHA 
051530   JSR ?PDIOV  Try the io
051533   PLA         Recover device
051534   TAX 
051535   BCC ?TRYPD  Error, retry
051537   LDA #0
051539   STA SHPDVS
051542   STA ?PDSELECT
051545   BEQ ?SIOEND Always
051547 ?NOTPD JSR SIOMAIN No pd
051550 ?SIOEND PLA   Exit all sio
051551   STA DUNIT
051554   LDA #0
051556    ASTA  CRITIC
051559   STY DSTATS
051562   LDY DSTATS
051565   RTS 
051566 PDEVID LDX #8 Device id
051568 ?51568 ROR A  routine
051569   BCS ?51574  set into vpirq
051571   DEX         on reset/boot
051572   BNE ?51568
051574 ?51574 LDA SHPDVS
051577   PHA 
051578   LDA ?51745-1,X
051581   STA SHPDVS
051584   STA ?PDSELECT
051587   JSR ?PDINTV
051590   PLA 
051591   STA SHPDVS
051594   STA ?PDSELECT
051597   PLA 
051598   TAX 
051599   PLA 
051600   RTI 
051601 OPEN.PD LDY #1 Parallel device
051603   JMP ?51676  vectors
051606 CLOSE.PD LDY #3
051608   JMP ?51676
051611 GET.PD LDY #5
051613   JMP ?51676
051616 PUT.PD LDY #7
051618   JMP ?51676
051621 STATUS.PD LDY #9
051623   JMP ?51676
051626 SPECL.PD LDY #11
051628   JMP ?51676
051631 ?SELECT DEX   Select next
051632   BPL ?51643  parallel device
051634   LDA #0
051636   STA SHPDVS
051639   STA ?PDSELECT
051642   RTS 
051643 ?51643 LDA PDVMSK
051646   AND ?51745,X
051649   BEQ ?SELECT
051651   STA SHPDVS
051654   STA ?PDSELECT
051657   RTS 
051658 ?51658 LDA ?PDDEVTB,Y Invoke
051661   PHA         parallel device
051662   DEY         handler
051663   LDA ?PDDEVTB,Y
051666   PHA 
051667   LDA PPTMPA
051670   LDX PPTMPX
051673   LDY #146
051675   RTS 
051676 ?51676 STA PPTMPA
051679   STX PPTMPX
051682    ALDA  CRITIC
051685   PHA 
051686   LDA #1
051688    ASTA  CRITIC
051691   LDX #8
051693 ?51693 JSR ?SELECT
051696   BEQ ?51715
051698   TXA 
051699   PHA 
051700   TYA 
051701   PHA 
051702   JSR ?51658
051705   BCC ?51739
051707   STA PPTMPA
051710   PLA 
051711   PLA 
051712   JMP ?51717
051715 ?51715 LDY #130
051717 ?51717 LDA #0
051719   STA SHPDVS
051722   STA ?PDSELECT
051725   PLA 
051726    ASTA  CRITIC
051729   LDA PPTMPA
051732   STY PPTMPX
051735   LDY PPTMPX
051738   RTS 
051739 ?51739 PLA 
051740   TAY 
051741   PLA 
051742   TAX 
051743   BCC ?51693
051745 ?51745 .BYTE $80,$40,$20,$10
051749   .BYTE $08,$04,$02,$01
051753 INITPD  ALDX  ICAX5Z Load and
051756   LDA ICAX4,X init peripheral
051759   JSR PHDLOD  handler
051762   BCS ?51796
051764   CLC 
051765   JSR L59550
051768   BCS ?51796
051770    ALDX  ICAX5Z
051773   LDA ICAX3,X
051776   JSR ERR130B
051779   BCS ?51796
051781    ALDX  ICAX5Z
051784   STA ICHID,X
051787   STA ICHIDZ
051789   LDA #3
051791   STA ICCOMT
051793   JMP IOC7
051796 ?51796 JMP ERR130
